OpenNI 1.3.2
|
00001 /**************************************************************************** 00002 * * 00003 * OpenNI 1.1 Alpha * 00004 * Copyright (C) 2011 PrimeSense Ltd. * 00005 * * 00006 * This file is part of OpenNI. * 00007 * * 00008 * OpenNI is free software: you can redistribute it and/or modify * 00009 * it under the terms of the GNU Lesser General Public License as published * 00010 * by the Free Software Foundation, either version 3 of the License, or * 00011 * (at your option) any later version. * 00012 * * 00013 * OpenNI is distributed in the hope that it will be useful, * 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00016 * GNU Lesser General Public License for more details. * 00017 * * 00018 * You should have received a copy of the GNU Lesser General Public License * 00019 * along with OpenNI. If not, see <http://www.gnu.org/licenses/>. * 00020 * * 00021 ****************************************************************************/ 00022 #ifndef _XN_QUEUE_H 00023 #define _XN_QUEUE_H 00024 00025 //--------------------------------------------------------------------------- 00026 // Includes 00027 //--------------------------------------------------------------------------- 00028 #include "XnList.h" 00029 00030 //--------------------------------------------------------------------------- 00031 // Types 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: 00128 XnList m_List; 00129 }; 00130 00136 #define XN_DECLARE_QUEUE_WITH_TRANSLATOR_DECL(decl, Type, ClassName, Translator, base) \ 00137 class decl ClassName : public base \ 00138 { \ 00139 public: \ 00140 ~ClassName() \ 00141 { \ 00142 /* We do this using Pop() to make sure memory is freed. */ \ 00143 Type dummy; \ 00144 while (Size() != 0) \ 00145 Pop(dummy); \ 00146 } \ 00147 XnStatus Push(Type const& value) \ 00148 { \ 00149 XnValue val = Translator::CreateValueCopy(value); \ 00150 XnStatus nRetVal = base::Push(val); \ 00151 if (nRetVal != XN_STATUS_OK) \ 00152 { \ 00153 Translator::FreeValue(val); \ 00154 return (nRetVal); \ 00155 } \ 00156 return XN_STATUS_OK; \ 00157 } \ 00158 XnStatus Pop(Type& value) \ 00159 { \ 00160 XnValue val; \ 00161 XnStatus nRetVal = base::Pop(val); \ 00162 if (nRetVal != XN_STATUS_OK) return (nRetVal); \ 00163 value = Translator::GetFromValue(val); \ 00164 return XN_STATUS_OK; \ 00165 } \ 00166 inline Type const& Top() const { return Translator::GetFromValue(base::Top()); }\ 00167 inline Type& Top() { return Translator::GetFromValue(base::Top()); } \ 00168 }; 00169 00175 #define XN_DECLARE_QUEUE_WITH_TRANSLATOR(Type, ClassName, Translator, base) \ 00176 XN_DECLARE_QUEUE_WITH_TRANSLATOR_DECL(, Type, ClassName, Translator, base) 00177 00182 #define XN_DECLARE_QUEUE_DECL(decl, Type, ClassName) \ 00183 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, Type, XN_DEFAULT_TRANSLATOR_NAME(ClassName)) \ 00184 XN_DECLARE_QUEUE_WITH_TRANSLATOR_DECL(decl, Type, ClassName, XN_DEFAULT_TRANSLATOR_NAME(ClassName), XnQueue) 00185 00189 #define XN_DECLARE_QUEUE(Type, ClassName) \ 00190 XN_DECLARE_QUEUE_DECL(, Type, ClassName) 00191 00192 #endif // _XN_QUEUE_H