summaryrefslogtreecommitdiff
path: root/trunk/ACE/ace/Functor.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/ACE/ace/Functor.h')
-rw-r--r--trunk/ACE/ace/Functor.h593
1 files changed, 593 insertions, 0 deletions
diff --git a/trunk/ACE/ace/Functor.h b/trunk/ACE/ace/Functor.h
new file mode 100644
index 00000000000..f303bc09c97
--- /dev/null
+++ b/trunk/ACE/ace/Functor.h
@@ -0,0 +1,593 @@
+// -*- C++ -*-
+
+//==========================================================================
+/**
+ * @file Functor.h
+ *
+ * $Id$
+ *
+ * Non-templatized classes and class template specializations for
+ * implementing function objects that are used in various places
+ * in ACE. There are currently two major categories of function
+ * objects in ACE: GoF Command Pattern objects, and STL-style
+ * functors for comparison of container elements. The command objects
+ * are invoked via an execute () method, while the STL-style functors are
+ * invoked via an operator() () method.
+ * Non-templatized classes for implementing the GoF Command Pattern,
+ * also known as functors or function objects.
+ *
+ *
+ * @author Chris Gill <cdgill@cs.wustl.edu>
+ * @author Based on Command Pattern implementations originally done by
+ * @author Carlos O'Ryan <coryan@cs.wustl.edu>
+ * @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
+ * @author Sergio Flores-Gaitan <sergio@cs.wustl.edu>
+ * @author and on STL-style functor implementations originally done by
+ * @author Irfan Pyarali <irfan@cs.wustl.edu>
+ */
+//==========================================================================
+
+
+#ifndef ACE_FUNCTOR_H
+#define ACE_FUNCTOR_H
+#include /**/ "ace/pre.h"
+
+#include /**/ "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include /**/ "ace/ACE_export.h"
+#include "ace/Basic_Types.h"
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+//////////////////////////////////////////////////////////////
+// GOF Command Pattern Classes and Template Specializations //
+//////////////////////////////////////////////////////////////
+
+/**
+ * @class ACE_Command_Base
+ *
+ * @brief Defines an abstract class that allows us to invoke commands
+ * without knowing anything about the implementation.
+ *
+ * This class declares an interface to execute a command
+ * independent of the effect of the command, or the objects used
+ * to implement it.
+ */
+class ACE_Export ACE_Command_Base
+{
+public:
+ // = Initialization and termination methods.
+ /// Default constructor.
+ ACE_Command_Base (void);
+
+ /// Virtual destructor.
+ virtual ~ACE_Command_Base (void);
+
+ /**
+ * Invokes the method encapsulated by the command, passing along the
+ * passed argument (if any). Users of classes derived from this
+ * class must ensure that the resulting invocation can tolerate a
+ * null void pointer being passed, or otherwise ensure that this
+ * will never occur.
+ */
+ virtual int execute (void *arg = 0) = 0;
+};
+
+////////////////////////////////////////////////////////////
+// STL-style Functor Classes and Template Specializations //
+////////////////////////////////////////////////////////////
+
+// Forward declaration since we are going to specialize that template
+// here. The template itself requires this file so every user of the
+// template should also see the specialization.
+template <class TYPE> class ACE_Hash;
+template <class TYPE> class ACE_Equal_To;
+template <class TYPE> class ACE_Less_Than;
+
+/**
+ * @class ACE_Hash<char>
+ *
+ * @brief Function object for hashing a char
+ */
+template<>
+class ACE_Export ACE_Hash<char>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (char t) const;
+};
+
+/**
+ * @class ACE_Hash<signed char>
+ *
+ * @brief Function object for hashing a signed char
+ */
+template<>
+class ACE_Export ACE_Hash<signed char>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (signed char t) const;
+};
+
+/**
+ * @class ACE_Hash<unsigned char>
+ *
+ * @brief Function object for hashing an unsigned char
+ */
+template<>
+class ACE_Export ACE_Hash<unsigned char>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (unsigned char t) const;
+};
+
+#if 0
+// @@ ADD HASHES FOR ACE TYPES
+
+/**
+ * @class ACE_Hash<ACE_INT16>
+ *
+ * @brief Function object for hashing a 16-bit signed number
+ */
+template<>
+class ACE_Export ACE_Hash<ACE_INT16>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (ACE_INT16 t) const;
+};
+
+/**
+ * @class ACE_Hash<ACE_UINT16>
+ *
+ * @brief Function object for hashing a 16-bit unsigned number
+ */
+template<>
+class ACE_Export ACE_Hash<ACE_UINT16>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (ACE_UINT16 t) const;
+};
+
+/**
+ * @class ACE_Hash<ACE_INT32>
+ *
+ * @brief Function object for hashing a 32-bit signed number
+ */
+template<>
+class ACE_Export ACE_Hash<ACE_INT32>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (ACE_INT32 t) const;
+};
+
+/**
+ * @class ACE_Hash<ACE_UINT32>
+ *
+ * @brief Function object for hashing a 32-bit unsigned number
+ */
+template<>
+class ACE_Export ACE_Hash<ACE_UINT32>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (ACE_UINT32 t) const;
+};
+
+/**
+ * @class ACE_Hash<ACE_UINT64>
+ *
+ * @brief Function object for hashing a 64-bit unsigned number
+ */
+template<>
+class ACE_Export ACE_Hash<ACE_UINT64>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (ACE_UINT64 t) const;
+};
+
+// @@ DONE ADDING HASHES FOR ACE TYPES
+#endif
+
+/**
+ * @class ACE_Hash<short>
+ *
+ * @brief Function object for hashing a short number
+ */
+template<>
+class ACE_Export ACE_Hash<short>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (short t) const;
+};
+
+/**
+ * @class ACE_Hash<unsigned short>
+ *
+ * @brief Function object for hashing an unsigned short number
+ */
+template<>
+class ACE_Export ACE_Hash<unsigned short>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (unsigned short t) const;
+};
+
+/**
+ * @class ACE_Hash<int>
+ *
+ * @brief Function object for hashing an int number
+ */
+template<>
+class ACE_Export ACE_Hash<int>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (int t) const;
+};
+
+/**
+ * @class ACE_Hash<unsigned int>
+ *
+ * @brief Function object for hashing an unsigned int number
+ */
+template<>
+class ACE_Export ACE_Hash<unsigned int>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (unsigned int t) const;
+};
+
+/**
+ * @class ACE_Hash<long>
+ *
+ * @brief Function object for hashing a long number
+ */
+template<>
+class ACE_Export ACE_Hash<long>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (long t) const;
+};
+
+/**
+ * @class ACE_Hash<unsigned long>
+ *
+ * @brief Function object for hashing an unsigned long number
+ */
+template<>
+class ACE_Export ACE_Hash<unsigned long>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (unsigned long t) const;
+};
+
+#if !defined (ACE_LACKS_LONGLONG_T) && (ACE_SIZEOF_LONG < 8)
+/**
+ * @class ACE_Hash<ACE_INT64>
+ *
+ * @brief Function object for hashing a signed 64-bit number
+ */
+template<>
+class ACE_Export ACE_Hash<ACE_INT64>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (ACE_INT64 t) const;
+};
+#endif /* !ACE_LACKS_LONGLONG_T && ACE_SIZEOF_LONG < 8 */
+
+// We can do this even if ACE_LACKS_UNSIGNEDLONGLONG_T because there's an
+// emulation for it in ACE_U_LongLong.
+#if (ACE_SIZEOF_LONG < 8)
+/**
+ * @class ACE_Hash<ACE_UINT64>
+ *
+ * @brief Function object for hashing an unsigned 64-bit number
+ */
+template<>
+class ACE_Export ACE_Hash<ACE_UINT64>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (const ACE_UINT64 &t) const;
+};
+#endif /* ACE_SIZEOF_LONG < 8 */
+
+/**
+ * @class ACE_Hash<const char *>
+ *
+ * @brief Function object for hashing a const string
+ */
+template<>
+class ACE_Export ACE_Hash<const char *>
+{
+public:
+ /// Calls ACE::hash_pjw
+ unsigned long operator () (const char *t) const;
+};
+
+/**
+ * @class ACE_Hash<char *>
+ *
+ * @brief Function object for hashing a string
+ */
+template<>
+class ACE_Export ACE_Hash<char *>
+{
+public:
+ /// Calls ACE::hash_pjw
+ unsigned long operator () (const char *t) const;
+};
+
+/**
+ * @class ACE_Hash<void *>
+ *
+ * @brief Function object for hashing a void *
+ */
+template<>
+class ACE_Export ACE_Hash<void *>
+{
+public:
+ unsigned long operator () (const void *) const;
+};
+
+/**
+ * @class ACE_Equal_To<const char *>
+ *
+ * @brief Function object for determining whether two const strings are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<const char *>
+{
+public:
+ /// Simply calls ACE_OS::strcmp
+ int operator () (const char *lhs,
+ const char *rhs) const;
+};
+
+/**
+ * @class ACE_Equal_To<char *>
+ *
+ * @brief Function object for determining whether two non-const
+ * strings are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<char *>
+{
+public:
+ /// Simply calls ACE_OS::strcmp
+ int operator () (const char *lhs,
+ const char *rhs) const;
+};
+
+/**
+ * @class ACE_Equal_To<ACE_UINT16>
+ *
+ * @brief Function object for determining whether two unsigned
+ * 16 bit ints are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<ACE_UINT16>
+{
+public:
+ /// Simply calls built-in operators
+ int operator () (const ACE_UINT16 lhs,
+ const ACE_UINT16 rhs) const;
+};
+
+/**
+ * @class ACE_Equal_To<ACE_INT16>
+ *
+ * @brief Function object for determining whether two
+ * 16 bit ints are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<ACE_INT16>
+{
+public:
+ /// Simply calls built-in operators
+ int operator () (const ACE_INT16 lhs,
+ const ACE_INT16 rhs) const;
+};
+
+/**
+ * @class ACE_Equal_To<ACE_UINT32>
+ *
+ * @brief Function object for determining whether two unsigned
+ * 32 bit ints are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<ACE_UINT32>
+{
+public:
+ /// Simply calls built-in operators
+ int operator () (const ACE_UINT32 lhs,
+ const ACE_UINT32 rhs) const;
+};
+
+/**
+ * @class ACE_Equal_To<ACE_INT32>
+ *
+ * @brief Function object for determining whether two
+ * 32 bit ints are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<ACE_INT32>
+{
+public:
+ /// Simply calls built-in operators
+ int operator () (const ACE_INT32 lhs,
+ const ACE_INT32 rhs) const;
+};
+
+/**
+ * @class ACE_Equal_To<ACE_UINT64>
+ *
+ * @brief Function object for determining whether two unsigned
+ * 64 bit ints are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<ACE_UINT64>
+{
+public:
+ /// Simply calls built-in operators
+ int operator () (const ACE_UINT64 lhs,
+ const ACE_UINT64 rhs) const;
+};
+
+/**
+ * @class ACE_Less_Than<const char*>
+ *
+ * @brief Function object for determining whether the first const string
+ * is less than the second const string.
+ */
+template<>
+class ACE_Export ACE_Less_Than<const char *>
+{
+public:
+ /// Simply calls ACE_OS::strcmp
+ int operator () (const char *lhs,
+ const char *rhs) const;
+};
+
+/**
+ * @class ACE_Less_Than<char *>
+ *
+ * @brief Function object for determining whether the first string
+ * is less than the second string.
+ */
+template<>
+class ACE_Export ACE_Less_Than<char *>
+{
+public:
+ /// Simply calls ACE_OS::strcmp
+ int operator () (const char *lhs,
+ const char *rhs) const;
+};
+
+#if defined (ACE_HAS_WCHAR)
+
+# if ! defined (ACE_LACKS_NATIVE_WCHAR_T)
+/**
+ * @class ACE_Hash<wchar_t>
+ *
+ * @brief Function object for hashing a wchar_t
+ */
+template<>
+class ACE_Export ACE_Hash<wchar_t>
+{
+public:
+ /// Simply returns t
+ unsigned long operator () (wchar_t t) const;
+};
+# endif /* ACE_LACKS_NATIVE_WCHAR_T */
+/**
+ * @class ACE_Hash<const wchar_t *>
+ *
+ * @brief Function object for hashing a const string
+ */
+template<>
+class ACE_Export ACE_Hash<const wchar_t *>
+{
+public:
+ /// Calls ACE::hash_pjw
+ unsigned long operator () (const wchar_t *t) const;
+};
+
+/**
+ * @class ACE_Hash<wchar_t *>
+ *
+ * @brief Function object for hashing a string
+ */
+template<>
+class ACE_Export ACE_Hash<wchar_t *>
+{
+public:
+ /// Calls ACE::hash_pjw
+ unsigned long operator () (const wchar_t *t) const;
+};
+
+/**
+ * @class ACE_Equal_To<const wchar_t *>
+ *
+ * @brief Function object for determining whether two const strings are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<const wchar_t *>
+{
+public:
+ /// Simply calls ACE_OS::strcmp
+ int operator () (const wchar_t *lhs,
+ const wchar_t *rhs) const;
+};
+
+/**
+ * @class ACE_Equal_To<wchar_t *>
+ *
+ * @brief Function object for determining whether two non-const
+ * strings are equal.
+ */
+template<>
+class ACE_Export ACE_Equal_To<wchar_t *>
+{
+public:
+ /// Simply calls ACE_OS::strcmp
+ int operator () (const wchar_t *lhs,
+ const wchar_t *rhs) const;
+};
+
+/**
+ * @class ACE_Less_Than<const wchar_t *>
+ *
+ * @brief Function object for determining whether the first const string
+ * is less than the second const string.
+ */
+template<>
+class ACE_Export ACE_Less_Than<const wchar_t *>
+{
+public:
+ /// Simply calls ACE_OS::strcmp
+ int operator () (const wchar_t *lhs,
+ const wchar_t *rhs) const;
+};
+
+/**
+ * @class ACE_Less_Than<wchar_t *>
+ *
+ * @brief Function object for determining whether the first string
+ * is less than the second string.
+ */
+template<>
+class ACE_Export ACE_Less_Than<wchar_t *>
+{
+public:
+ /// Simply calls ACE_OS::strcmp
+ int operator () (const wchar_t *lhs,
+ const wchar_t *rhs) const;
+};
+
+#endif // ACE_HAS_WCHAR
+
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "ace/Functor.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* ACE_FUNCTOR_H */