diff --git a/include/loki/Register.h b/include/loki/Register.h new file mode 100755 index 0000000..34a326d --- /dev/null +++ b/include/loki/Register.h @@ -0,0 +1,122 @@ +//////////////////////////////////////////////////////////////////////////////// +// The Loki Library +// Copyright (c) 2006 Peter Kümmel +// Permission to use, copy, modify, distribute and sell this software for any +// purpose is hereby granted without fee, provided that the above copyright +// notice appear in all copies and that both that copyright notice and this +// permission notice appear in supporting documentation. +// The author makes no representations about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. +//////////////////////////////////////////////////////////////////////////////// +#ifndef LOKI_REGISTER_INC_ +#define LOKI_REGISTER_INC_ + +// $Header$ + +#include "TypeManip.h" +#include "HierarchyGenerators.h" + +/// \defgroup RegisterGroup Register + +namespace Loki +{ + + //////////////////////////////////////////////////////////////////////////////// + // + // Helper classes/functions for RegisterByCreateSet + // + //////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////// + /// \ingroup Register + /// Must be specialized be the user + //////////////////////////////////////////////////////////////////////////////// + template bool RegisterFunction(); + + //////////////////////////////////////////////////////////////////////////////// + /// \ingroup Register + /// Must be specialized be the user + //////////////////////////////////////////////////////////////////////////////// + template bool UnRegisterFunction(); + + namespace Private + { + template + struct RegisterOnCreate + { + RegisterOnCreate() { RegisterFunction(); } + }; + + template + struct UnRegisterOnDelete + { + ~UnRegisterOnDelete() { UnRegisterFunction(); } + }; + + template + struct RegisterOnCreateElement + { + RegisterOnCreate registerObj; + }; + + template + struct UnRegisterOnDeleteElement + { + UnRegisterOnDelete unregisterObj; + }; + } + + //////////////////////////////////////////////////////////////////////////////// + /// \class RegisterOnCreateSet + /// + /// \ingroup Register + /// Implements a generic register class which registers classes of a typelist + /// + /// \par Usage + /// see test/Register + //////////////////////////////////////////////////////////////////////////////// + + template + struct RegisterOnCreateSet + : GenScatterHierarchy + {}; + + //////////////////////////////////////////////////////////////////////////////// + /// \class UnRegisterOnDeleteSet + /// + /// \ingroup Register + /// Implements a generic register class which unregisters classes of a typelist + /// + /// \par Usage + /// see test/Register + //////////////////////////////////////////////////////////////////////////////// + template + struct UnRegisterOnDeleteSet + : GenScatterHierarchy + {}; + + + //////////////////////////////////////////////////////////////////////////////// + /// \def LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST ) + /// + /// \ingroup Register + /// Check if CLASS is in the typelist LIST. + /// + /// \par Usage + /// see test/Register + //////////////////////////////////////////////////////////////////////////////// + +#define LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST ) \ + \ + struct Loki_##CLASS##LIST_OK{typedef int class_##CLASS##_is_not_in_##LIST;};\ + typedef Loki::Select::value == -1, \ + CLASS,Loki_##CLASS##LIST_OK >::Result IsInList##CLASS##LIST; \ + typedef IsInList##CLASS##LIST::class_##CLASS##_is_not_in_##LIST \ + isInListTest##CLASS##LIST; + +} // namespace Loki + + +#endif +