// Hash table class definition
template <typename TRAITS>
-class SHash : public TRAITS
- , private noncopyable
+class EMPTY_BASES_DECL SHash : public TRAITS
+ , private noncopyable
{
friend class VerifyLayoutsMD; // verifies class layout doesn't accidentally change
public:
- class Index
-#ifdef _DEBUG
- // CheckedIteratorBase is a no-op in RET builds. having it as an empty base-class
- // causes differences in the sizeof(SHash::Iterator) in DAC vs. non-DAC builds.
- // avoid the issue by not specifying it as a base class in RET builds
+ class EMPTY_BASES_DECL Index
: public CheckedIteratorBase< SHash<TRAITS> >
-#endif
{
friend class SHash;
friend class Iterator;
}
};
- class Iterator : public Index, public Enumerator<const element_t, Iterator>
+ class EMPTY_BASES_DECL Iterator : public Index, public Enumerator<const element_t, Iterator>
{
friend class SHash;
// is artificially bumped to m_tableSize when the end of iteration is reached.
// This allows a canonical End iterator to be used.
- class KeyIndex : public Index
+ class EMPTY_BASES_DECL KeyIndex : public Index
{
friend class SHash;
friend class KeyIterator;
}
};
- class KeyIterator : public KeyIndex, public Enumerator<const element_t, KeyIterator>
+ class EMPTY_BASES_DECL KeyIterator : public KeyIndex, public Enumerator<const element_t, KeyIterator>
{
friend class SHash;
// disables support for DAC marshaling. Useful for defining right-side only SHashes
template <typename PARENT>
-class NonDacAwareSHashTraits : public PARENT
+class EMPTY_BASES_DECL NonDacAwareSHashTraits : public PARENT
{
public:
typedef typename PARENT::element_t element_t;
// disables support for removing elements - produces slightly faster implementation
template <typename PARENT>
-class NoRemoveSHashTraits : public PARENT
+class EMPTY_BASES_DECL NoRemoveSHashTraits : public PARENT
{
public:
// explicitly declare local typedefs for these traits types, otherwise
// It relies on methods GetKey and Hash defined on ELEMENT
template <typename ELEMENT, typename KEY>
-class PtrSHashTraits : public DefaultSHashTraits<ELEMENT *>
+class EMPTY_BASES_DECL PtrSHashTraits : public DefaultSHashTraits<ELEMENT *>
{
public:
};
template <typename ELEMENT, typename KEY>
-class PtrSHash : public SHash< PtrSHashTraits<ELEMENT, KEY> >
+class EMPTY_BASES_DECL PtrSHash : public SHash< PtrSHashTraits<ELEMENT, KEY> >
{
};
// a class that automatically deletes data referenced by the pointers (so effectively it takes ownership of the data)
// since I was too lazy to implement Remove() APIs properly, removing entries is disallowed
template <typename ELEMENT, typename KEY>
-class PtrSHashWithCleanup : public SHash< NoRemoveSHashTraits< PtrSHashWithCleanupTraits<ELEMENT, KEY> > >
+class EMPTY_BASES_DECL PtrSHashWithCleanup : public SHash< NoRemoveSHashTraits< PtrSHashWithCleanupTraits<ELEMENT, KEY> > >
{
};
// pointer hash tables.
template <typename ElementT, typename CharT, typename ComparerT = CaseSensitiveStringCompareHash<CharT> >
-class StringSHashTraits : public PtrSHashTraits<ElementT, CharT const *>
+class EMPTY_BASES_DECL StringSHashTraits : public PtrSHashTraits<ElementT, CharT const *>
{
public:
// explicitly declare local typedefs for these traits types, otherwise
};
template <typename COMINTERFACE, typename CharT, typename ComparerT = CaseSensitiveStringCompareHash<CharT> >
-class StringHashWithCleanupTraits : public StringSHashTraits<StringHashElement<COMINTERFACE, CharT>, CharT, ComparerT>
+class EMPTY_BASES_DECL StringHashWithCleanupTraits : public StringSHashTraits<StringHashElement<COMINTERFACE, CharT>, CharT, ComparerT>
{
public:
void OnDestructPerEntryCleanupAction(StringHashElement<COMINTERFACE, CharT> * e)
};
template <typename COMINTERFACE, typename CharT, typename ComparerT = CaseSensitiveStringCompareHash<CharT> >
-class StringSHashWithCleanup : public SHash< StringHashWithCleanupTraits<COMINTERFACE, CharT, ComparerT> >
+class EMPTY_BASES_DECL StringSHashWithCleanup : public SHash< StringHashWithCleanupTraits<COMINTERFACE, CharT, ComparerT> >
{
};
template <typename ELEMENT>
-class StringSHash : public SHash< StringSHashTraits<ELEMENT, CHAR> >
+class EMPTY_BASES_DECL StringSHash : public SHash< StringSHashTraits<ELEMENT, CHAR> >
{
};
template <typename ELEMENT>
-class WStringSHash : public SHash< StringSHashTraits<ELEMENT, WCHAR> >
+class EMPTY_BASES_DECL WStringSHash : public SHash< StringSHashTraits<ELEMENT, WCHAR> >
{
};
template <typename ELEMENT>
-class SStringSHashTraits : public PtrSHashTraits<ELEMENT, SString>
+class EMPTY_BASES_DECL SStringSHashTraits : public PtrSHashTraits<ELEMENT, SString>
{
public:
typedef PtrSHashTraits<ELEMENT, SString> PARENT;
};
template <typename ELEMENT>
-class SStringSHash : public SHash< SStringSHashTraits<ELEMENT> >
+class EMPTY_BASES_DECL SStringSHash : public SHash< SStringSHashTraits<ELEMENT> >
{
};
template <typename ELEMENT>
-class SetSHashTraits : public DefaultSHashTraits<ELEMENT>
+class EMPTY_BASES_DECL SetSHashTraits : public DefaultSHashTraits<ELEMENT>
{
public:
// explicitly declare local typedefs for these traits types, otherwise
};
template <typename ELEMENT, typename TRAITS = NoRemoveSHashTraits< SetSHashTraits <ELEMENT> > >
-class SetSHash : public SHash< TRAITS >
+class EMPTY_BASES_DECL SetSHash : public SHash< TRAITS >
{
typedef SHash<TRAITS> PARENT;
};
template <typename ELEMENT>
-class PtrSetSHashTraits : public SetSHashTraits<ELEMENT>
+class EMPTY_BASES_DECL PtrSetSHashTraits : public SetSHashTraits<ELEMENT>
{
public:
};
template <typename PARENT_TRAITS>
-class DeleteElementsOnDestructSHashTraits : public PARENT_TRAITS
+class EMPTY_BASES_DECL DeleteElementsOnDestructSHashTraits : public PARENT_TRAITS
{
public:
static inline void OnDestructPerEntryCleanupAction(typename PARENT_TRAITS::element_t e)
};
template <typename KEY, typename VALUE>
-class MapSHashTraits : public DefaultSHashTraits< KeyValuePair<KEY,VALUE> >
+class EMPTY_BASES_DECL MapSHashTraits : public DefaultSHashTraits< KeyValuePair<KEY,VALUE> >
{
public:
// explicitly declare local typedefs for these traits types, otherwise
};
template <typename KEY, typename VALUE, typename TRAITS = NoRemoveSHashTraits< MapSHashTraits <KEY, VALUE> > >
-class MapSHash : public SHash< TRAITS >
+class EMPTY_BASES_DECL MapSHash : public SHash< TRAITS >
{
typedef SHash< TRAITS > PARENT;
};
template <typename KEY, typename VALUE>
-class MapSHashWithRemove : public SHash< MapSHashTraits <KEY, VALUE> >
+class EMPTY_BASES_DECL MapSHashWithRemove : public SHash< MapSHashTraits <KEY, VALUE> >
{
typedef SHash< MapSHashTraits <KEY, VALUE> > PARENT;
typedef DPTR(class SString) PTR_SString;
-class SString : private SBuffer
+class EMPTY_BASES_DECL SString : private SBuffer
{
friend struct _DacGlobals;
protected:
- class UIndex : public SBuffer::Index
+ class EMPTY_BASES_DECL UIndex : public SBuffer::Index
{
friend class SString;
friend class Indexer<WCHAR, UIterator>;
public:
- class UIterator : public UIndex, public Indexer<WCHAR, UIterator>
+ class EMPTY_BASES_DECL UIterator : public UIndex, public Indexer<WCHAR, UIterator>
{
friend class SString;
protected:
- class Index : public SBuffer::Index
+ class EMPTY_BASES_DECL Index : public SBuffer::Index
{
friend class SString;
public:
- class CIterator : public Index, public Indexer<const WCHAR, CIterator>
+ class EMPTY_BASES_DECL CIterator : public Index, public Indexer<const WCHAR, CIterator>
{
friend class SString;
WCHAR operator[](int index) const { return Index::operator[](index); }
};
- class Iterator : public Index, public Indexer<WCHAR, Iterator>
+ class EMPTY_BASES_DECL Iterator : public Index, public Indexer<WCHAR, Iterator>
{
friend class SString;
// ===========================================================================
template <COUNT_T MEMSIZE>
-class InlineSString : public SString
+class EMPTY_BASES_DECL InlineSString : public SString
{
private:
BYTE m_inline[SBUFFER_PADDED_SIZE(MEMSIZE)];
// ScratchBuffer classes are used by the GetXXX() routines to allocate scratch space in.
// ================================================================================
-class SString::AbstractScratchBuffer : private SString
+class EMPTY_BASES_DECL SString::AbstractScratchBuffer : private SString
{
protected:
// Do not use this class directly - use
};
template <COUNT_T MEMSIZE>
-class ScratchBuffer : public SString::AbstractScratchBuffer
+class EMPTY_BASES_DECL ScratchBuffer : public SString::AbstractScratchBuffer
{
private:
BYTE m_inline[MEMSIZE];