From 6a11e3e811804a47d3203fa323d15460ed0e3cf2 Mon Sep 17 00:00:00 2001 From: Nicolas Hake Date: Sun, 20 Sep 2015 13:26:43 +0200 Subject: [PATCH] Stop checking for rvalue ref support We already require support for std::unique_ptr, which itself requires support for rvalue references. As such, we know we can use rvalue references, and thus don't have to keep carrying dead code around. --- CMakeLists.txt | 1 - config.h.cmake | 3 --- src/gui/C4StartupPlrSelDlg.h | 2 +- src/lib/C4InputValidation.h | 2 +- src/lib/StdAdaptors.h | 12 ++++++------ src/lib/StdBuf.h | 30 +++++++++--------------------- src/lib/StdCompiler.h | 12 ++++++------ src/lib/StdMeshMaterial.cpp | 6 +++--- src/lib/StdMeshMaterial.h | 6 +++--- src/network/C4NetIO.cpp | 6 +++--- src/network/C4NetIO.h | 6 +++--- src/network/C4Network2Client.cpp | 2 +- src/network/C4Network2Client.h | 2 +- src/platform/PlatformAbstraction.h | 9 --------- src/script/C4PropList.h | 2 -- src/script/C4StringTable.h | 10 ++-------- 16 files changed, 39 insertions(+), 72 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 714dda299..5538e1277 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,6 @@ if(USE_GCC_STD_0X) endif() REQUIRE_CXX_SOURCE_COMPILES("#include \nint main() { std::unique_ptr a; std::shared_ptr b; }" HAVE_C11_SMART_PTRS) -CHECK_CXX_SOURCE_COMPILES("void f(struct D&&); int main() { return 0; }" HAVE_RVALUE_REF) CHECK_CXX_SOURCE_COMPILES("int main() { void *d = nullptr; }" HAVE_NULLPTR) CHECK_CXX_SOURCE_COMPILES("int main() { static_assert(true, \"\"); }" HAVE_STATIC_ASSERT) CHECK_CXX_SOURCE_COMPILES("#include \nint main() { auto a = std::make_unique(0); }" HAVE_MAKE_UNIQUE) diff --git a/config.h.cmake b/config.h.cmake index ce3cf50c7..4f57bc7ee 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -52,9 +52,6 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_READLINE_READLINE_H 1 -/* C++ Compiler has rvalue references, a C++0x feature. */ -#cmakedefine HAVE_RVALUE_REF 1 - /* Define to 1 if you have SDL. */ #cmakedefine HAVE_SDL 1 diff --git a/src/gui/C4StartupPlrSelDlg.h b/src/gui/C4StartupPlrSelDlg.h index 40131c6c1..aa7de4b54 100644 --- a/src/gui/C4StartupPlrSelDlg.h +++ b/src/gui/C4StartupPlrSelDlg.h @@ -81,7 +81,7 @@ private: class LoadError : public StdStrBuf { public: - LoadError(StdStrBuf RREF rTakeFrom) { Take(std::move(rTakeFrom)); } + LoadError(StdStrBuf &&rTakeFrom) { Take(std::move(rTakeFrom)); } }; // class thrown off load function if load failed }; diff --git a/src/lib/C4InputValidation.h b/src/lib/C4InputValidation.h index 8a78a3fd9..da31a6c0d 100644 --- a/src/lib/C4InputValidation.h +++ b/src/lib/C4InputValidation.h @@ -65,7 +65,7 @@ template struct C4StrValAdapt template inline bool operator == (const D &nValue) const { return rValue == nValue; } template inline C4StrValAdapt &operator = (const D &nValue) { rValue = nValue; return *this; } }; -template inline C4StrValAdapt mkStrValAdapt(T RREF rValue, C4InVal::ValidationOption eValType) { return C4StrValAdapt(rValue, eValType); } +template inline C4StrValAdapt mkStrValAdapt(T &&rValue, C4InVal::ValidationOption eValType) { return C4StrValAdapt(rValue, eValType); } // StdStrBuf that validates on compilation struct ValidatedStdCopyStrBufBase : public StdCopyStrBuf diff --git a/src/lib/StdAdaptors.h b/src/lib/StdAdaptors.h index bf2eaacb0..cc7223e5e 100644 --- a/src/lib/StdAdaptors.h +++ b/src/lib/StdAdaptors.h @@ -62,7 +62,7 @@ struct StdDefaultAdapt } }; template -inline StdDefaultAdapt mkDefaultAdapt(T RREF rValue, const D &rDefault) { return StdDefaultAdapt(rValue, rDefault); } +inline StdDefaultAdapt mkDefaultAdapt(T &&rValue, const D &rDefault) { return StdDefaultAdapt(rValue, rDefault); } // * Naming Adaptor // Embeds a value into a named section, failsafe @@ -90,7 +90,7 @@ struct StdNamingAdapt template inline StdNamingAdapt &operator = (const D &nValue) { rValue = nValue; return *this; } }; template -inline StdNamingAdapt mkNamingAdapt(T RREF rValue, const char *szName) { return StdNamingAdapt(rValue, szName); } +inline StdNamingAdapt mkNamingAdapt(T &&rValue, const char *szName) { return StdNamingAdapt(rValue, szName); } // * Naming Adaptor (defaulting) // Embeds a value into a named section, sets default on fail @@ -127,7 +127,7 @@ struct StdNamingDefaultAdapt } }; template -inline StdNamingDefaultAdapt mkNamingAdapt(T RREF rValue, const char *szName, const D &rDefault, bool fPrefillDefault=false, bool fStoreDefault=false) { return StdNamingDefaultAdapt(rValue, szName, rDefault, fPrefillDefault, fStoreDefault); } +inline StdNamingDefaultAdapt mkNamingAdapt(T &&rValue, const char *szName, const D &rDefault, bool fPrefillDefault=false, bool fStoreDefault=false) { return StdNamingDefaultAdapt(rValue, szName, rDefault, fPrefillDefault, fStoreDefault); } // * Decompiling Adaptor // Allows to use const objects if the compiler won't change the targets @@ -170,7 +170,7 @@ struct StdRuntimeValueAdapt template inline StdRuntimeValueAdapt &operator = (const D &nValue) { rValue = nValue; return *this; } }; template -inline StdRuntimeValueAdapt mkRuntimeValueAdapt(T RREF rValue) { return StdRuntimeValueAdapt(rValue); } +inline StdRuntimeValueAdapt mkRuntimeValueAdapt(T &&rValue) { return StdRuntimeValueAdapt(rValue); } // * String adaptor struct StdStringAdapt @@ -432,7 +432,7 @@ struct StdInsertAdapt } }; template -inline StdInsertAdapt mkInsertAdapt(T RREF rObj, I RREF rIns, bool fBefore = true) { return StdInsertAdapt(rObj, rIns, fBefore); } +inline StdInsertAdapt mkInsertAdapt(T &&rObj, I &&rIns, bool fBefore = true) { return StdInsertAdapt(rObj, rIns, fBefore); } // * Parameter Adaptor // Specify a second parameter for the CompileFunc @@ -453,7 +453,7 @@ struct StdParameterAdapt inline T &GetObj() { return rObj; } }; template -inline StdParameterAdapt mkParAdapt(T RREF rObj, const P &rPar) { return StdParameterAdapt(rObj, rPar); } +inline StdParameterAdapt mkParAdapt(T &&rObj, const P &rPar) { return StdParameterAdapt(rObj, rPar); } // for mkArrayAdaptMap template diff --git a/src/lib/StdBuf.h b/src/lib/StdBuf.h index 2ebe39daf..2cf23b71a 100644 --- a/src/lib/StdBuf.h +++ b/src/lib/StdBuf.h @@ -55,7 +55,6 @@ public: else Ref(Buf2); } -#ifdef HAVE_RVALUE_REF StdBuf(const StdBuf & Buf2, bool fCopy = true) : fRef(true), pData(NULL), iSize(0) { @@ -64,7 +63,7 @@ public: else Ref(Buf2); } - StdBuf(StdBuf RREF Buf2, bool fCopy = false) + StdBuf(StdBuf &&Buf2, bool fCopy = false) : fRef(true), pData(NULL), iSize(0) { if (fCopy) @@ -74,7 +73,6 @@ public: else Ref(Buf2); } -#endif // Set by constant data. Copies data if desired. StdBuf(const void *pData, size_t iSize, bool fCopy = false) @@ -289,12 +287,10 @@ public: { Take(Buf2.GrabPointer(), Buf2.getSize()); } -#ifdef HAVE_RVALUE_REF - void Take(StdBuf RREF Buf2) + void Take(StdBuf &&Buf2) { Take(Buf2.GrabPointer(), Buf2.getSize()); } -#endif // * File support bool LoadFromFile(const char *szFile); @@ -326,7 +322,7 @@ public: bool operator != (const StdBuf &Buf2) const { return ! operator == (Buf2); } // Set (as constructor: take if possible) - StdBuf &operator = (StdBuf RREF Buf2) + StdBuf &operator = (StdBuf &&Buf2) { if (Buf2.isRef()) Ref(Buf2); else Take(std::move(Buf2)); return *this; @@ -378,14 +374,12 @@ public: StdCopyBuf(const StdCopyBuf &Buf2, bool fCopy = true) : StdBuf(Buf2.getRef(), fCopy) { } -#ifdef HAVE_RVALUE_REF - StdCopyBuf(StdBuf RREF Buf2, bool fCopy = false) + StdCopyBuf(StdBuf &&Buf2, bool fCopy = false) : StdBuf(std::move(Buf2), fCopy) { } - StdCopyBuf(StdCopyBuf RREF Buf2, bool fCopy = false) + StdCopyBuf(StdCopyBuf &&Buf2, bool fCopy = false) : StdBuf(std::move(Buf2), fCopy) { } -#endif // Set by constant data. Copies data by default. StdCopyBuf(const void *pData, size_t iSize, bool fCopy = true) @@ -418,16 +412,14 @@ public: : StdBuf(Buf2, fCopy) { } -#ifdef HAVE_RVALUE_REF // This constructor is important, because the compiler will create one // otherwise, despite having two other constructors to choose from StdStrBuf(const StdStrBuf & Buf2, bool fCopy = true) : StdBuf(Buf2, fCopy) { } - StdStrBuf(StdStrBuf RREF Buf2, bool fCopy = false) + StdStrBuf(StdStrBuf &&Buf2, bool fCopy = false) : StdBuf(std::move(Buf2), fCopy) { } -#endif // Set by constant data. References data by default, copies if specified. explicit StdStrBuf(const char *pData, bool fCopy = false) @@ -482,9 +474,7 @@ public: void Ref(const StdStrBuf &Buf2) { StdBuf::Ref(Buf2.getData(), Buf2.getSize()); } StdStrBuf getRef() const { return StdStrBuf(getData(), getLength()); } void Take(StdStrBuf & Buf2) { StdBuf::Take(Buf2); } -#ifdef HAVE_RVALUE_REF - void Take(StdStrBuf RREF Buf2) { StdBuf::Take(std::move(Buf2)); } -#endif + void Take(StdStrBuf &&Buf2) { StdBuf::Take(std::move(Buf2)); } void Clear() { StdBuf::Clear(); } void Copy() { StdBuf::Copy(); } @@ -706,14 +696,12 @@ public: StdCopyStrBuf(const StdCopyStrBuf &Buf2, bool fCopy = true) : StdStrBuf(Buf2.getRef(), fCopy) { } -#ifdef HAVE_RVALUE_REF - StdCopyStrBuf(StdStrBuf RREF Buf2, bool fCopy = false) + StdCopyStrBuf(StdStrBuf &&Buf2, bool fCopy = false) : StdStrBuf(std::move(Buf2), fCopy) { } - StdCopyStrBuf(StdCopyStrBuf RREF Buf2, bool fCopy = false) + StdCopyStrBuf(StdCopyStrBuf &&Buf2, bool fCopy = false) : StdStrBuf(std::move(Buf2), fCopy) { } -#endif // Set by constant data. Copies data if desired. explicit StdCopyStrBuf(const char *pData, bool fCopy = true) diff --git a/src/lib/StdCompiler.h b/src/lib/StdCompiler.h index c9f07c62f..0dc7105fe 100644 --- a/src/lib/StdCompiler.h +++ b/src/lib/StdCompiler.h @@ -179,7 +179,7 @@ public: void Value(bool &rBool) { Boolean(rBool); } // Compiling/Decompiling (may throw a data format exception!) - template inline void Compile(T RREF rStruct) + template inline void Compile(T &&rStruct) { assert(isCompiler()); DoCompilation(rStruct); @@ -379,7 +379,7 @@ void CompileNewFuncCtx(T *&pStruct, StdCompiler *pComp, const ContextT& rCtx, co // Helpers for buffer-based compiling (may throw a data format exception!) template -void CompileFromBuf(StructT RREF TargetStruct, const typename CompT::InT &SrcBuf) +void CompileFromBuf(StructT &&TargetStruct, const typename CompT::InT &SrcBuf) { CompT Compiler; Compiler.setInput(SrcBuf.getRef()); @@ -490,7 +490,7 @@ public: // Input typedef StdBuf InT; - void setInput(InT RREF In) { Buf = std::move(In); } + void setInput(InT &&In) { Buf = std::move(In); } // Properties virtual bool isCompiler() { return true; } @@ -734,7 +734,7 @@ private: void StdCompilerWarnCallback(void *pData, const char *szPosition, const char *szError); template -bool CompileFromBuf_Log(StructT RREF TargetStruct, const typename CompT::InT &SrcBuf, const char *szName) +bool CompileFromBuf_Log(StructT &&TargetStruct, const typename CompT::InT &SrcBuf, const char *szName) { try { @@ -752,7 +752,7 @@ bool CompileFromBuf_Log(StructT RREF TargetStruct, const typename CompT::InT &Sr } } template -bool CompileFromBuf_LogWarn(StructT RREF TargetStruct, const typename CompT::InT &SrcBuf, const char *szName) +bool CompileFromBuf_LogWarn(StructT &&TargetStruct, const typename CompT::InT &SrcBuf, const char *szName) { try { @@ -773,7 +773,7 @@ bool CompileFromBuf_LogWarn(StructT RREF TargetStruct, const typename CompT::InT } } template -bool DecompileToBuf_Log(StructT RREF TargetStruct, typename CompT::OutT *pOut, const char *szName) +bool DecompileToBuf_Log(StructT &&TargetStruct, typename CompT::OutT *pOut, const char *szName) { if (!pOut) return false; try diff --git a/src/lib/StdMeshMaterial.cpp b/src/lib/StdMeshMaterial.cpp index 725d952f3..eff4950a7 100644 --- a/src/lib/StdMeshMaterial.cpp +++ b/src/lib/StdMeshMaterial.cpp @@ -645,7 +645,7 @@ StdMeshMaterialShaderParameter::StdMeshMaterialShaderParameter(const StdMeshMate CopyDeep(other); } -StdMeshMaterialShaderParameter::StdMeshMaterialShaderParameter(StdMeshMaterialShaderParameter RREF other) +StdMeshMaterialShaderParameter::StdMeshMaterialShaderParameter(StdMeshMaterialShaderParameter &&other) { Move(std::move(other)); } @@ -667,7 +667,7 @@ StdMeshMaterialShaderParameter& StdMeshMaterialShaderParameter::operator=(const return *this; } -StdMeshMaterialShaderParameter& StdMeshMaterialShaderParameter::operator=(StdMeshMaterialShaderParameter RREF other) +StdMeshMaterialShaderParameter& StdMeshMaterialShaderParameter::operator=(StdMeshMaterialShaderParameter &&other) { if(this == &other) return *this; @@ -726,7 +726,7 @@ void StdMeshMaterialShaderParameter::CopyDeep(const StdMeshMaterialShaderParamet } } -void StdMeshMaterialShaderParameter::Move(StdMeshMaterialShaderParameter RREF other) +void StdMeshMaterialShaderParameter::Move(StdMeshMaterialShaderParameter &&other) { CopyShallow(other); other.type = FLOAT; diff --git a/src/lib/StdMeshMaterial.h b/src/lib/StdMeshMaterial.h index e9d68ebeb..115b13f44 100644 --- a/src/lib/StdMeshMaterial.h +++ b/src/lib/StdMeshMaterial.h @@ -63,11 +63,11 @@ public: StdMeshMaterialShaderParameter(); // type=FLOAT, value uninitialized StdMeshMaterialShaderParameter(Type type); // value uninitialized StdMeshMaterialShaderParameter(const StdMeshMaterialShaderParameter& other); - StdMeshMaterialShaderParameter(StdMeshMaterialShaderParameter RREF other); + StdMeshMaterialShaderParameter(StdMeshMaterialShaderParameter &&other); ~StdMeshMaterialShaderParameter(); StdMeshMaterialShaderParameter& operator=(const StdMeshMaterialShaderParameter& other); - StdMeshMaterialShaderParameter& operator=(StdMeshMaterialShaderParameter RREF other); + StdMeshMaterialShaderParameter& operator=(StdMeshMaterialShaderParameter &&other); Type GetType() const { return type; } void SetType(Type type); // changes type, new value is uninitialized @@ -88,7 +88,7 @@ public: private: void CopyShallow(const StdMeshMaterialShaderParameter& other); void CopyDeep(const StdMeshMaterialShaderParameter& other); - void Move(StdMeshMaterialShaderParameter RREF other); + void Move(StdMeshMaterialShaderParameter &&other); Type type; diff --git a/src/network/C4NetIO.cpp b/src/network/C4NetIO.cpp index 064aeda44..53f04303d 100644 --- a/src/network/C4NetIO.cpp +++ b/src/network/C4NetIO.cpp @@ -2258,7 +2258,7 @@ C4NetIOUDP::Packet::Packet() } -C4NetIOUDP::Packet::Packet(C4NetIOPacket RREF rnData, nr_t inNr) +C4NetIOUDP::Packet::Packet(C4NetIOPacket &&rnData, nr_t inNr) : iNr(inNr), Data(rnData), pFragmentGot(NULL) @@ -2867,7 +2867,7 @@ bool C4NetIOUDP::Peer::SendDirect(const Packet &rPacket, unsigned int iNr) return fSuccess; } -bool C4NetIOUDP::Peer::SendDirect(C4NetIOPacket RREF rPacket) // (mt-safe) +bool C4NetIOUDP::Peer::SendDirect(C4NetIOPacket &&rPacket) // (mt-safe) { // insert correct addr if (!(rPacket.getStatus() & 0x80)) rPacket.SetAddr(addr); @@ -2996,7 +2996,7 @@ bool C4NetIOUDP::BroadcastDirect(const Packet &rPacket, unsigned int iNr) // (mt return fSuccess; } -bool C4NetIOUDP::SendDirect(C4NetIOPacket RREF rPacket) // (mt-safe) +bool C4NetIOUDP::SendDirect(C4NetIOPacket &&rPacket) // (mt-safe) { addr_t toaddr = rPacket.getAddr(); // packet meant to be broadcasted? diff --git a/src/network/C4NetIO.h b/src/network/C4NetIO.h index 40404db10..b5d7e841d 100644 --- a/src/network/C4NetIO.h +++ b/src/network/C4NetIO.h @@ -507,7 +507,7 @@ protected: // construction / destruction Packet(); - Packet(C4NetIOPacket RREF rnData, nr_t inNr); + Packet(C4NetIOPacket &&rnData, nr_t inNr); ~Packet(); protected: @@ -681,7 +681,7 @@ protected: // sending bool SendDirect(const Packet &rPacket, unsigned int iNr = ~0); - bool SendDirect(C4NetIOPacket RREF rPacket); + bool SendDirect(C4NetIOPacket &&rPacket); // events void OnConn(); @@ -739,7 +739,7 @@ protected: // sending bool BroadcastDirect(const Packet &rPacket, unsigned int iNr = ~0u); // (mt-safe) - bool SendDirect(C4NetIOPacket RREF rPacket); // (mt-safe) + bool SendDirect(C4NetIOPacket &&rPacket); // (mt-safe) // multicast related bool DoLoopbackTest(); diff --git a/src/network/C4Network2Client.cpp b/src/network/C4Network2Client.cpp index d52f046de..5b2052a87 100644 --- a/src/network/C4Network2Client.cpp +++ b/src/network/C4Network2Client.cpp @@ -537,7 +537,7 @@ bool C4Network2ClientList::SendMsgToHost(C4NetIOPacket rPkt) return pHost->SendMsg(rPkt); } -bool C4Network2ClientList::SendMsgToClient(int32_t iClient, C4NetIOPacket RREF rPkt) +bool C4Network2ClientList::SendMsgToClient(int32_t iClient, C4NetIOPacket &&rPkt) { // find client C4Network2Client *pClient = GetClientByID(iClient); diff --git a/src/network/C4Network2Client.h b/src/network/C4Network2Client.h index b2fd8d0dc..daa58babd 100644 --- a/src/network/C4Network2Client.h +++ b/src/network/C4Network2Client.h @@ -203,7 +203,7 @@ public: bool BroadcastMsgToConnClients(const C4NetIOPacket &rPkt); bool BroadcastMsgToClients(const C4NetIOPacket &rPkt); bool SendMsgToHost(C4NetIOPacket rPkt); - bool SendMsgToClient(int32_t iClient, C4NetIOPacket RREF rPkt); + bool SendMsgToClient(int32_t iClient, C4NetIOPacket &&rPkt); // packet handling void HandlePacket(char cStatus, const C4PacketBase *pBasePkt, C4Network2IOConnection *pConn); diff --git a/src/platform/PlatformAbstraction.h b/src/platform/PlatformAbstraction.h index 0e4d95b20..c44a234c1 100644 --- a/src/platform/PlatformAbstraction.h +++ b/src/platform/PlatformAbstraction.h @@ -118,15 +118,6 @@ typedef ptrdiff_t ssize_t; -#ifdef HAVE_RVALUE_REF -# define RREF && -#else -# define RREF & -namespace std { template inline T &move (T &t) { return t; } } -#endif - - - #if defined(_DEBUG) && defined(_MSC_VER) // use inline assembler to invoke the "breakpoint exception" # define BREAKPOINT_HERE __debugbreak() diff --git a/src/script/C4PropList.h b/src/script/C4PropList.h index fc6734321..ff5b511b7 100644 --- a/src/script/C4PropList.h +++ b/src/script/C4PropList.h @@ -48,11 +48,9 @@ public: C4Property(const C4Property &o) : Key(o.Key), Value(o.Value) { if (Key) Key->IncRef(); } C4Property & operator = (const C4Property &o) { if(o.Key) o.Key->IncRef(); if (Key) Key->DecRef(); Key = o.Key; Value = o.Value; return *this; } -#ifdef HAVE_RVALUE_REF C4Property(C4Property && o) : Key(o.Key), Value(std::move(o.Value)) { o.Key = 0; } C4Property & operator = (C4Property && o) { if (Key) Key->DecRef(); Key = o.Key; o.Key = 0; Value = std::move(o.Value); return *this; } -#endif ~C4Property() { if (Key) Key->DecRef(); } void CompileFunc(StdCompiler *pComp, C4ValueNumbers *); C4String * Key; diff --git a/src/script/C4StringTable.h b/src/script/C4StringTable.h index 3f1ca44a4..710554e57 100644 --- a/src/script/C4StringTable.h +++ b/src/script/C4StringTable.h @@ -50,11 +50,10 @@ public: C4RefCntPointer(T* p): p(p) { IncRef(); } C4RefCntPointer(): p(0) { } template C4RefCntPointer(const C4RefCntPointer & r): p(r.p) { IncRef(); } -#ifdef HAVE_RVALUE_REF // Move constructor - template C4RefCntPointer(C4RefCntPointer RREF r): p(r.p) { r.p = 0; } + template C4RefCntPointer(C4RefCntPointer &&r): p(r.p) { r.p = 0; } // Move assignment - template C4RefCntPointer& operator = (C4RefCntPointer RREF r) + template C4RefCntPointer& operator = (C4RefCntPointer &&r) { if (p != r.p) { @@ -64,7 +63,6 @@ public: } return *this; } -#endif ~C4RefCntPointer() { DecRef(); } template C4RefCntPointer& operator = (U* new_p) { @@ -113,14 +111,12 @@ template class C4Set *p = e; return p; } -#ifdef HAVE_RVALUE_REF T * AddInternal(T && e) { T * p = GetPlaceFor(e); *p = std::move(e); return p; } -#endif void MaintainCapacity() { if (Capacity - Size < Max(2u, Capacity / 4)) @@ -198,7 +194,6 @@ public: ++Size; return r; } -#ifdef HAVE_RVALUE_REF T * Add(T && e) { MaintainCapacity(); @@ -206,7 +201,6 @@ public: ++Size; return r; } -#endif template void Remove(H e) { unsigned int h = Hash(e);