summaryrefslogtreecommitdiffstats
path: root/tests/manual/kinectsurface/QtKinectWrapper/OpenNI/Include/XnList.h
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/kinectsurface/QtKinectWrapper/OpenNI/Include/XnList.h')
-rw-r--r--tests/manual/kinectsurface/QtKinectWrapper/OpenNI/Include/XnList.h749
1 files changed, 749 insertions, 0 deletions
diff --git a/tests/manual/kinectsurface/QtKinectWrapper/OpenNI/Include/XnList.h b/tests/manual/kinectsurface/QtKinectWrapper/OpenNI/Include/XnList.h
new file mode 100644
index 00000000..82665f83
--- /dev/null
+++ b/tests/manual/kinectsurface/QtKinectWrapper/OpenNI/Include/XnList.h
@@ -0,0 +1,749 @@
+/****************************************************************************
+* *
+* OpenNI 1.x Alpha *
+* Copyright (C) 2011 PrimeSense Ltd. *
+* *
+* This file is part of OpenNI. *
+* *
+* OpenNI is free software: you can redistribute it and/or modify *
+* it under the terms of the GNU Lesser General Public License as published *
+* by the Free Software Foundation, either version 3 of the License, or *
+* (at your option) any later version. *
+* *
+* OpenNI is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU Lesser General Public License for more details. *
+* *
+* You should have received a copy of the GNU Lesser General Public License *
+* along with OpenNI. If not, see <http://www.gnu.org/licenses/>. *
+* *
+****************************************************************************/
+#ifndef _XN_LIST_H
+#define _XN_LIST_H
+
+//---------------------------------------------------------------------------
+// Includes
+//---------------------------------------------------------------------------
+#include <XnDataTypes.h>
+#include <IXnNodeAllocator.h>
+#include <XnNodeAllocator.h>
+#include <XnNode.h>
+#include <XnStatusCodes.h>
+
+//---------------------------------------------------------------------------
+// Types
+//---------------------------------------------------------------------------
+
+/**
+ * The linked list
+ */
+class XnList
+{
+public:
+ class ConstIterator
+ {
+ public:
+ friend class XnList;
+
+ /**
+ * Copy constructor
+ *
+ * @param other [in] instance to copy from
+ */
+ ConstIterator(const ConstIterator& other) : m_pCurrent(other.m_pCurrent) {}
+
+ /**
+ * Support ++iterator, go to the next object in the list
+ */
+ ConstIterator& operator++()
+ {
+ m_pCurrent = m_pCurrent->Next();
+ return *this;
+ }
+
+ /**
+ * Support iterator++, go to the next object in the list, returning the old value
+ */
+ ConstIterator operator++(int)
+ {
+ ConstIterator other(m_pCurrent);
+ m_pCurrent = m_pCurrent->Next();
+ return other;
+ }
+
+ /**
+ * Support --iterator, go to the next object in the list
+ */
+ ConstIterator& operator--()
+ {
+ m_pCurrent = m_pCurrent->Previous();
+ return *this;
+ }
+
+ /**
+ * Support iterator--, go to the next object in the list, returning the old value
+ */
+ ConstIterator operator--(int)
+ {
+ ConstIterator other = *this;
+ --*this;
+ return other;
+ }
+
+ /**
+ * Operator to check if 2 iterators point to the same object
+ *
+ * @param other [in] instance to compare with
+ */
+ XnBool operator==(const ConstIterator& other) const
+ {
+ return m_pCurrent == other.m_pCurrent;
+ }
+ /**
+ * Operator to check if 2 iterators point to different objects
+ *
+ * @param other [in] instance to compare with
+ */
+ XnBool operator!=(const ConstIterator& other) const
+ {
+ return m_pCurrent != other.m_pCurrent;
+ }
+
+ /**
+ * Get the value of the current object (const version)
+ */
+ const XnValue& operator*() const
+ {
+ return m_pCurrent->Data();
+ }
+
+
+ /**
+ * Get the entire current object (const version)
+ */
+ const XnNode* GetNode() const
+ {
+ return m_pCurrent;
+ }
+
+ /**
+ * Get the entire current object (non-const version)
+ */
+ XnNode* GetNode()
+ {
+ return m_pCurrent;
+ }
+
+ protected:
+ /**
+ * constructor to be used from inside the XnList. It points to the node supplied.
+ *
+ * @param pNode [in] The XnNode to which to currently point
+ */
+ ConstIterator(XnNode* pNode) : m_pCurrent(pNode) {}
+
+ /** The current XnNode */
+ XnNode* m_pCurrent;
+ };
+
+ /**
+ * Iterator to the XnList
+ */
+ class Iterator : public ConstIterator
+ {
+ public:
+ friend class XnList;
+
+ /**
+ * Copy constructor
+ *
+ * @param other [in] instance to copy from
+ */
+ inline Iterator(const Iterator& other) : ConstIterator(other) {}
+
+ /**
+ * Support ++iterator, go to the next object in the list
+ */
+ inline Iterator& operator++()
+ {
+ ++(*(ConstIterator*)this);
+ return (*this);
+ }
+ /**
+ * Support iterator++, go to the next object in the list, returning the old value
+ */
+ inline Iterator operator++(int)
+ {
+ Iterator result = *this;
+ ++*this;
+ return (result);
+ }
+
+ /**
+ * Support --iterator, go to the next object in the list
+ */
+ inline Iterator& operator--()
+ {
+ --(*(ConstIterator*)this);
+ return (*this);
+ }
+ /**
+ * Support iterator--, go to the next object in the list, returning the old value
+ */
+ inline Iterator operator--(int)
+ {
+ Iterator result = *this;
+ --*this;
+ return (result);
+ }
+
+ /**
+ * Get the value of the current object
+ */
+ inline XnValue& operator*() const { return ((XnValue&)**(ConstIterator*)this); }
+
+ protected:
+ /**
+ * constructor to be used from inside the XnList. It points to the node supplied.
+ *
+ * @param pNode [in] The XnNode to which to currently point
+ */
+ inline Iterator(XnNode* pNode) : ConstIterator(pNode) {}
+ };
+
+public:
+ /**
+ * Constructor. Initialize internal representations
+ */
+ XnList()
+ {
+ //Default node allocator is XnNodeAllocator
+ Init(XN_NEW(XnNodeAllocator));
+ m_bOwnsAllocator = TRUE;
+ }
+
+ /**
+ * Destructor. Destroy internal representations
+ */
+ virtual ~XnList()
+ {
+ Clear();
+
+ // Return base node to the pool
+ m_pNodeAllocator->Deallocate(m_pBase);
+
+ if (m_bOwnsAllocator)
+ {
+ //We created the allocator in this object, so we must release it
+ XN_DELETE(m_pNodeAllocator);
+ }
+ }
+
+ /**
+ * Add a new value at the beginning of list
+ *
+ * @param value [in] The value to add to the head of the list
+ *
+ * @return XN_STATUS_ALLOC_FAILED Failed to add to the list because no nodes are available.
+ */
+ XnStatus AddFirst(const XnValue& value)
+ {
+ return Add(m_pBase, value);
+ }
+
+ /**
+ * Add a new value at the end of the list
+ *
+ * @param value [in] The value to add to the tail of the list
+ *
+ * @return XN_STATUS_ALLOC_FAILED Failed to add to the list because no nodes are available.
+ */
+ XnStatus AddLast(const XnValue& value)
+ {
+ return Add(rbegin().m_pCurrent, value);
+ }
+
+ /**
+ * Add a new value after the object pointed to by the iterator
+ *
+ * @param where [in] iterator to the position after which to add the new value
+ * @param val [in] The value to add to the list
+ *
+ * @return XN_STATUS_ALLOC_FAILED Failed to add to the list because no nodes are available,
+ * XN_STATUS_ILLEGAL_POSITION iterator is invalid
+ */
+ XnStatus AddAfter(ConstIterator where, const XnValue& val)
+ {
+ if (where == end())
+ {
+ return XN_STATUS_ILLEGAL_POSITION;
+ }
+
+ return Add(where.m_pCurrent, val);
+ }
+
+ /**
+ * Add a new value before the object pointed to by the iterator
+ *
+ * @param where [in] iterator to the position before which to add the new value
+ * @param val [in] The value to add to the list
+ *
+ * @return XN_STATUS_ALLOC_FAILED Failed to add to the list because no nodes are available,
+ */
+ XnStatus AddBefore(ConstIterator where, const XnValue& val)
+ {
+ if (where == end())
+ {
+ return XN_STATUS_ILLEGAL_POSITION;
+ }
+
+ return Add(where.m_pCurrent->Previous(), val);
+ }
+
+
+ /**
+ * Get an iterator pointing to a value in the list.
+ *
+ * @param value [in] The searched value
+ *
+ * @return end() if value doesn't exist
+ */
+ Iterator Find(const XnValue& value)
+ {
+ if (IsEmpty())
+ {
+ return end();
+ }
+
+ Iterator iter = begin();
+ for (; iter != end(); ++iter)
+ {
+ if (*iter == value)
+ break;
+ }
+ return iter;
+ }
+
+
+ /**
+ * Get an iterator pointing to a value in the list.
+ *
+ * @param value [in] The searched value
+ *
+ * @return end() if value doesn't exist
+ */
+ ConstIterator Find(const XnValue& value) const
+ {
+ if (IsEmpty())
+ {
+ return end();
+ }
+
+ ConstIterator iter = begin();
+ for (; iter != end(); ++iter)
+ {
+ if (*iter == value)
+ break;
+ }
+ return iter;
+ }
+
+
+ /**
+ * Remove a value from the list
+ *
+ * @param where [in] Iterator pointing to an entry in the list
+ * @param value [out] The value that was in the removed entry
+ *
+ * @return XN_STATUS_ILLEGAL_POSITION iterator was invalid
+ */
+ XnStatus Remove(ConstIterator where, XnValue& value)
+ {
+ value = *where;
+ return Remove(where);
+ }
+
+ /**
+ * Remove a value from the list
+ *
+ * @param where [in] Iterator pointing to an entry in the list
+ *
+ * @return XN_STATUS_ILLEGAL_POSITION iterator was invalid
+ */
+ virtual XnStatus Remove(ConstIterator where)
+ {
+ // Verify iterator is valid
+ if (where == end())
+ {
+ return XN_STATUS_ILLEGAL_POSITION;
+ }
+ if (IsEmpty())
+ {
+ return XN_STATUS_IS_EMPTY;
+ }
+
+ XnNode* pToRemove = where.m_pCurrent;
+
+ // Connect other nodes to bypass the one removed
+ pToRemove->Previous()->Next() = pToRemove->Next();
+ pToRemove->Next()->Previous() = pToRemove->Previous();
+
+ // Return removed node to the pool
+ m_pNodeAllocator->Deallocate(pToRemove);
+
+ return XN_STATUS_OK;
+ }
+
+
+ /**
+ * Remove all entries from the list
+ */
+ XnStatus Clear()
+ {
+ while (!IsEmpty())
+ Remove(begin());
+
+ return XN_STATUS_OK;
+ }
+
+ /**
+ * Check if list is empty
+ */
+ XnBool IsEmpty() const
+ {
+ return (begin() == end());
+ }
+
+ /**
+ * Current size of the list
+ */
+ XnUInt32 Size() const
+ {
+ XnUInt32 nSize = 0;
+ for (ConstIterator iter = begin(); iter != end(); ++iter, ++nSize)
+ ;
+
+ return nSize;
+ }
+
+ /**
+ * An iterator to the first entry of the list (non-const version)
+ */
+ Iterator begin()
+ {
+ return Iterator(m_pBase->Next());
+ }
+
+ /**
+ * An iterator to the first entry of the list (const version)
+ */
+ ConstIterator begin() const
+ {
+ return ConstIterator(m_pBase->Next());
+ }
+
+ /**
+ * An iterator 1to the end of the list (non-const version). The position is invalid.
+ */
+ Iterator end()
+ {
+ return Iterator(m_pBase);
+ }
+
+ /**
+ * An iterator to the end of the list (const version). The position is invalid.
+ */
+ ConstIterator end() const
+ {
+ return ConstIterator(m_pBase);
+ }
+
+ /**
+ * An iterator to the last entry of the list (non-const version)
+ */
+ Iterator rbegin()
+ {
+ return Iterator(m_pBase->Previous());
+ }
+
+ /**
+ * An iterator to the last entry of the list (const version)
+ */
+ ConstIterator rbegin() const
+ {
+ return ConstIterator(m_pBase->Previous());
+ }
+
+ /**
+ * An iterator to the beginning of the list (non-const version). This position is invalid
+ */
+ Iterator rend()
+ {
+ return Iterator(m_pBase);
+ }
+
+ /**
+ * An iterator to the beginning of the list (const version). This position is invalid
+ */
+ ConstIterator rend() const
+ {
+ return ConstIterator(m_pBase);
+ }
+
+protected:
+ friend class XnNodeManager;
+
+ /**
+ * Constructor. Initialize internal representations
+ */
+ XnList(INiNodeAllocator* pNodeAllocator)
+ {
+ Init(pNodeAllocator);
+ m_bOwnsAllocator = FALSE;
+ }
+
+ void Init(INiNodeAllocator* pNodeAllocator)
+ {
+ m_pNodeAllocator = pNodeAllocator;
+ // Allocate a node to act as base node.
+ m_pBase = m_pNodeAllocator->Allocate();
+ if (m_pBase == NULL)
+ {
+ // OZOZ: Allocation failed in ctor...
+ }
+
+ m_pBase->Next() = m_pBase->Previous() = m_pBase;
+ }
+
+ /**
+ * Add a new value to the list
+ *
+ * @param pWhere [in] The XnNode after which to add the new value
+ * @param val [in] The value to add to the list
+ *
+ * @return XN_STATUS_ALLOC_FAILED Failed to add to the list because no nodes are available,
+ */
+ XnStatus Add(XnNode* pWhere, const XnValue& val)
+ {
+ // Get a node from the pool for the entry
+ XnNode* pNewNode = m_pNodeAllocator->Allocate();
+ if (pNewNode == NULL)
+ {
+ return XN_STATUS_ALLOC_FAILED;
+ }
+ // push new node to position
+ pNewNode->Data() = val;
+ pNewNode->Next() = pWhere->Next();
+ pNewNode->Previous() = pWhere;
+ pWhere->Next()->Previous() = pNewNode;
+ pWhere->Next() = pNewNode;
+
+ return XN_STATUS_OK;
+ }
+
+
+ /** The base node for the list */
+ XnNode* m_pBase;
+
+ INiNodeAllocator* m_pNodeAllocator;
+ XnBool m_bOwnsAllocator;
+
+private:
+ XN_DISABLE_COPY_AND_ASSIGN(XnList);
+};
+
+/**
+* Declares a list of type @a Type, which is named @a ClassName. The list uses translator @a Translator,
+* and is declared using the @a decl declspec.
+*/
+#define XN_DECLARE_LIST_WITH_TRANSLATOR_DECL(decl, Type, ClassName, Translator) \
+ class decl ClassName : public XnList \
+ { \
+ public: \
+ class decl ConstIterator : public XnList::ConstIterator \
+ { \
+ public: \
+ friend class ClassName; \
+ inline ConstIterator(const ConstIterator& other) : XnList::ConstIterator(other) {} \
+ inline ConstIterator& operator++() \
+ { \
+ ++(*(XnList::ConstIterator*)this); \
+ return (*this); \
+ } \
+ inline ConstIterator operator++(int) \
+ { \
+ ConstIterator result = *this; \
+ ++*this; \
+ return result; \
+ } \
+ inline ConstIterator& operator--() \
+ { \
+ --(*(XnList::ConstIterator*)this); \
+ return (*this); \
+ } \
+ inline ConstIterator operator--(int) \
+ { \
+ ConstIterator result = *this; \
+ --*this; \
+ return result; \
+ } \
+ inline Type const& operator*() const \
+ { \
+ return Translator::GetFromValue(**((XnList::ConstIterator*)this)); \
+ } \
+ inline Type const* operator->() const { return (&**this); } \
+ protected: \
+ inline ConstIterator(XnNode* pNode) : XnList::ConstIterator(pNode) {} \
+ inline ConstIterator(const XnList::ConstIterator& other) : \
+ XnList::ConstIterator(other) \
+ {} \
+ }; \
+ class decl Iterator : public ConstIterator \
+ { \
+ public: \
+ friend class ClassName; \
+ Iterator(const Iterator& other) : ConstIterator(other) {} \
+ inline Iterator& operator++() \
+ { \
+ ++(*(ConstIterator*)this); \
+ return (*this); \
+ } \
+ inline Iterator operator++(int) \
+ { \
+ Iterator result = *this; \
+ ++*this; \
+ return result; \
+ } \
+ inline Iterator& operator--() \
+ { \
+ --(*(ConstIterator*)this); \
+ return (*this); \
+ } \
+ inline Iterator operator--(int) \
+ { \
+ Iterator result = *this; \
+ --*this; \
+ return result; \
+ } \
+ inline Type& operator*() const { return ((Type&)**(ConstIterator*)this); } \
+ inline Type* operator->() const { return (&**this); } \
+ protected: \
+ inline Iterator(XnNode* pNode) : ConstIterator(pNode) {} \
+ inline Iterator(const XnList::Iterator& other) : ConstIterator(other) {} \
+ }; \
+ public: \
+ ClassName() \
+ { \
+ } \
+ ~ClassName() \
+ { \
+ while (!IsEmpty()) \
+ Remove(begin()); \
+ } \
+ inline XnStatus AddFirst(Type const& value) \
+ { \
+ XnValue val = Translator::CreateValueCopy(value); \
+ XnStatus nRetVal = XnList::AddFirst(val); \
+ if (nRetVal != XN_STATUS_OK) \
+ { \
+ Translator::FreeValue(val); \
+ return (nRetVal); \
+ } \
+ return XN_STATUS_OK; \
+ } \
+ inline XnStatus AddLast(Type const& value) \
+ { \
+ XnValue val = Translator::CreateValueCopy(value); \
+ XnStatus nRetVal = XnList::AddLast(val); \
+ if (nRetVal != XN_STATUS_OK) \
+ { \
+ Translator::FreeValue(val); \
+ return (nRetVal); \
+ } \
+ return XN_STATUS_OK; \
+ } \
+ inline XnStatus AddAfter(ConstIterator where, Type const& value) \
+ { \
+ XnValue val = Translator::CreateValueCopy(value); \
+ XnStatus nRetVal = XnList::AddAfter(where, val); \
+ if (nRetVal != XN_STATUS_OK) \
+ { \
+ Translator::FreeValue(val); \
+ return (nRetVal); \
+ } \
+ return XN_STATUS_OK; \
+ } \
+ inline XnStatus AddBefore(ConstIterator where, Type const& value) \
+ { \
+ XnValue val = Translator::CreateValueCopy(value); \
+ XnStatus nRetVal = XnList::AddBefore(where, val); \
+ if (nRetVal != XN_STATUS_OK) \
+ { \
+ Translator::FreeValue(val); \
+ return (nRetVal); \
+ } \
+ return XN_STATUS_OK; \
+ } \
+ inline ConstIterator Find(Type const& value) const \
+ { \
+ XnValue _value = Translator::GetAsValue(value); \
+ return XnList::Find(_value); \
+ } \
+ inline Iterator Find(Type const& value) \
+ { \
+ XnValue _value = Translator::GetAsValue(value); \
+ return XnList::Find(_value); \
+ } \
+ inline XnStatus Remove(ConstIterator where) \
+ { \
+ XnValue val = Translator::GetAsValue(*where); \
+ XnStatus nRetVal = XnList::Remove(where); \
+ if (nRetVal != XN_STATUS_OK) return (nRetVal); \
+ Translator::FreeValue(val); \
+ return XN_STATUS_OK; \
+ } \
+ inline XnStatus Remove(Type const& value) \
+ { \
+ Iterator it = Find(value); \
+ return Remove(it); \
+ } \
+ inline Iterator begin() { return XnList::begin(); } \
+ inline ConstIterator begin() const { return XnList::begin(); } \
+ inline Iterator end() { return XnList::end(); } \
+ inline ConstIterator end() const { return XnList::end(); } \
+ inline Iterator rbegin() { return XnList::rbegin(); } \
+ inline ConstIterator rbegin() const { return XnList::rbegin(); } \
+ inline Iterator rend() { return XnList::rend(); } \
+ inline ConstIterator rend() const { return XnList::rend(); } \
+ protected: \
+ virtual XnStatus Remove(XnList::ConstIterator where) \
+ { \
+ return Remove(ConstIterator(where)); \
+ } \
+ private: \
+ XN_DISABLE_COPY_AND_ASSIGN(ClassName); \
+ };
+
+/**
+* Declares a list of type @a Type, which is named @a ClassName. The list uses translator @a Translator.
+*/
+#define XN_DECLARE_LIST_WITH_TRANSLATOR(Type, ClassName, Translator) \
+ XN_DECLARE_LIST_WITH_TRANSLATOR_DECL(, Type, ClassName, Translator)
+
+/**
+* Declares a list of type @a Type, which is named @a ClassName. The list uses creates a default translator
+* and is declared using the @a decl declspec.
+*/
+#define XN_DECLARE_LIST_DECL(decl, Type, ClassName) \
+ XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, Type, XN_DEFAULT_TRANSLATOR_NAME(ClassName)) \
+ XN_DECLARE_LIST_WITH_TRANSLATOR_DECL(decl, Type, ClassName, XN_DEFAULT_TRANSLATOR_NAME(ClassName))
+
+/**
+* Declares a list of type @a Type, which is named @a ClassName. The list uses creates a default translator.
+*/
+#define XN_DECLARE_LIST(Type, ClassName) \
+ XN_DECLARE_LIST_DECL(, Type, ClassName)
+
+#endif // _XN_LIST_H
+