00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _XN_QUEUE_H
00023 #define _XN_QUEUE_H
00024
00025
00026
00027
00028 #include "XnList.h"
00029
00030
00031
00032
00036 class XnQueue
00037 {
00038 public:
00042 XnQueue() {}
00046 virtual ~XnQueue() {}
00047
00051 virtual XnStatus Init()
00052 {
00053 return (XN_STATUS_OK);
00054 }
00055
00063 virtual XnStatus Push(XnValue const& value)
00064 {
00065 XnStatus nRetVal = XN_STATUS_OK;
00066
00067 nRetVal = m_List.AddLast(value);
00068 XN_IS_STATUS_OK(nRetVal);
00069
00070 return (XN_STATUS_OK);
00071 }
00079 virtual XnStatus Pop(XnValue& value)
00080 {
00081 if (IsEmpty())
00082 {
00083 return XN_STATUS_IS_EMPTY;
00084 }
00085
00086 value = *(m_List.begin());
00087 return m_List.Remove(m_List.begin());
00088 }
00089
00095 XnValue const& Top() const
00096 {
00097 return *(m_List.begin());
00098 }
00099
00105 XnValue& Top()
00106 {
00107 return *(m_List.begin());
00108 }
00109
00113 XnBool IsEmpty() const
00114 {
00115 return m_List.IsEmpty();
00116 }
00117
00121 virtual XnUInt32 Size() const
00122 {
00123 return m_List.Size();
00124 }
00125
00126 private:
00127 XN_DISABLE_COPY_AND_ASSIGN(XnQueue);
00128
00130 XnList m_List;
00131 };
00132
00138 #define XN_DECLARE_QUEUE_WITH_TRANSLATOR_DECL(decl, Type, ClassName, Translator, base) \
00139 class decl ClassName : public base \
00140 { \
00141 public: \
00142 ClassName() {} \
00143 ~ClassName() \
00144 { \
00145 \
00146 Type dummy; \
00147 while (Size() != 0) \
00148 Pop(dummy); \
00149 } \
00150 XnStatus Push(Type const& value) \
00151 { \
00152 XnValue val = Translator::CreateValueCopy(value); \
00153 XnStatus nRetVal = base::Push(val); \
00154 if (nRetVal != XN_STATUS_OK) \
00155 { \
00156 Translator::FreeValue(val); \
00157 return (nRetVal); \
00158 } \
00159 return XN_STATUS_OK; \
00160 } \
00161 XnStatus Pop(Type& value) \
00162 { \
00163 XnValue val; \
00164 XnStatus nRetVal = base::Pop(val); \
00165 if (nRetVal != XN_STATUS_OK) return (nRetVal); \
00166 value = Translator::GetFromValue(val); \
00167 Translator::FreeValue(val); \
00168 return XN_STATUS_OK; \
00169 } \
00170 inline Type const& Top() const { return Translator::GetFromValue(base::Top()); }\
00171 inline Type& Top() { return Translator::GetFromValue(base::Top()); } \
00172 private: \
00173 XN_DISABLE_COPY_AND_ASSIGN(ClassName); \
00174 };
00175
00181 #define XN_DECLARE_QUEUE_WITH_TRANSLATOR(Type, ClassName, Translator, base) \
00182 XN_DECLARE_QUEUE_WITH_TRANSLATOR_DECL(, Type, ClassName, Translator, base)
00183
00188 #define XN_DECLARE_QUEUE_DECL(decl, Type, ClassName) \
00189 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, Type, XN_DEFAULT_TRANSLATOR_NAME(ClassName)) \
00190 XN_DECLARE_QUEUE_WITH_TRANSLATOR_DECL(decl, Type, ClassName, XN_DEFAULT_TRANSLATOR_NAME(ClassName), XnQueue)
00191
00195 #define XN_DECLARE_QUEUE(Type, ClassName) \
00196 XN_DECLARE_QUEUE_DECL(, Type, ClassName)
00197
00198 #endif // _XN_QUEUE_H