summaryrefslogtreecommitdiffstats
path: root/tests/kinectsurface/QtKinectWrapper/OpenNI/Include/XnArray.h
diff options
context:
space:
mode:
Diffstat (limited to 'tests/kinectsurface/QtKinectWrapper/OpenNI/Include/XnArray.h')
-rw-r--r--tests/kinectsurface/QtKinectWrapper/OpenNI/Include/XnArray.h313
1 files changed, 313 insertions, 0 deletions
diff --git a/tests/kinectsurface/QtKinectWrapper/OpenNI/Include/XnArray.h b/tests/kinectsurface/QtKinectWrapper/OpenNI/Include/XnArray.h
new file mode 100644
index 00000000..d90cff0c
--- /dev/null
+++ b/tests/kinectsurface/QtKinectWrapper/OpenNI/Include/XnArray.h
@@ -0,0 +1,313 @@
+/****************************************************************************
+* *
+* 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 __XNARRAY_H__
+#define __XNARRAY_H__
+
+//---------------------------------------------------------------------------
+// Includes
+//---------------------------------------------------------------------------
+#include <XnOS.h>
+
+//---------------------------------------------------------------------------
+// Types
+//---------------------------------------------------------------------------
+template <typename T>
+class XnArray
+{
+public:
+ enum {BASE_SIZE = 8};
+
+ /** An iterator object that allows you to iterate over members in the array. **/
+ typedef T* Iterator;
+
+ /** A constant iterator object that allows you to iterate over members in the array as read-only values. **/
+ typedef const T* ConstIterator;
+
+ /** Default constructor. Initializes the array to BASE_SIZE. **/
+ XnArray(XnUInt32 nBaseSize = BASE_SIZE)
+ {
+ Init(nBaseSize);
+ }
+
+ /** Copy constructor. Initializes this array from another array of the same type. **/
+ XnArray(const XnArray& other) : m_pData(NULL), m_nSize(0), m_nAllocatedSize(0)
+ {
+ *this = other;
+ }
+
+ /** Destructor. Deallocates data in this array. **/
+ virtual ~XnArray()
+ {
+ XN_DELETE_ARR(m_pData);
+ }
+
+ /** Assignment operator. Copies data from another array of the same type. **/
+ XnArray& operator=(const XnArray& other)
+ {
+ CopyFrom(other);
+ return *this;
+ }
+
+ /** Copies data from another array of the same type. **/
+ XnStatus CopyFrom(const XnArray& other)
+ {
+ if (this != &other)
+ {
+ XnStatus nRetVal = SetData(other.m_pData, other.m_nSize);
+ XN_IS_STATUS_OK(nRetVal);
+ }
+ return XN_STATUS_OK;
+ }
+
+ /** Copies data from a raw buffer of the same type pointed to by pData, and sets size to nSize. **/
+ XnStatus SetData(const T* pData, XnUInt32 nSize)
+ {
+ Clear();
+ XnStatus nRetVal = SetSize(nSize);
+ XN_IS_STATUS_OK(nRetVal);
+ for (XnUInt32 i = 0; i < nSize; i++)
+ {
+ m_pData[i] = pData[i];
+ }
+ return XN_STATUS_OK;
+ }
+
+ /** @returns the raw data of this array as a read-only buffer. **/
+ const T* GetData() const
+ {
+ return m_pData;
+ }
+
+ /** @returns the raw data of this array as a modifiable buffer. **/
+ T* GetData()
+ {
+ return m_pData;
+ }
+
+ /** Reserves space in this array for the specified number of elements.
+ This saves you re-allocations and data copies if you know the size in advance. **/
+ XnStatus Reserve(XnUInt32 nReservedSize)
+ {
+ if (nReservedSize > m_nAllocatedSize)
+ {
+ //Calculate next power of 2 after nReservedSize
+ nReservedSize--;
+ nReservedSize = (nReservedSize >> 1) | nReservedSize;
+ nReservedSize = (nReservedSize >> 2) | nReservedSize;
+ nReservedSize = (nReservedSize >> 4) | nReservedSize;
+ nReservedSize = (nReservedSize >> 8) | nReservedSize;
+ nReservedSize = (nReservedSize >> 16) | nReservedSize;
+ nReservedSize++; // nReservedSize is now the next power of 2.
+
+ //Allocate new data
+ T* pNewData = XN_NEW_ARR(T, nReservedSize);
+ XN_VALIDATE_ALLOC_PTR(pNewData);
+
+ //Copy old data into new data
+ for (XnUInt32 i = 0; i < m_nSize; i++)
+ {
+ pNewData[i] = m_pData[i];
+ }
+
+ //Delete old data
+ XN_DELETE_ARR(m_pData);
+
+ //Point to new data
+ m_pData = pNewData;
+ m_nAllocatedSize = nReservedSize;
+ }
+ return XN_STATUS_OK;
+ }
+
+ /** @returns TRUE if this array is empty, FALSE otherwise. **/
+ XnBool IsEmpty() const
+ {
+ return (m_nSize == 0);
+ }
+
+ /** @returns The number of elements in this array. **/
+ XnUInt32 GetSize() const
+ {
+ return m_nSize;
+ }
+
+ /** Sets the size of this array to the specified number of elements.
+ Note that for primitive types, the data is uninitialized. **/
+ XnStatus SetSize(XnUInt32 nSize)
+ {
+ //TODO: Shrink allocated array if new size is smaller
+ XnStatus nRetVal = SetMinSize(nSize);
+ XN_IS_STATUS_OK(nRetVal);
+ m_nSize = nSize;
+ return XN_STATUS_OK;
+ }
+
+ /** Sets the size of this array to the specified number of elements, initializing all elements with the
+ value specified by fillVal. **/
+ XnStatus SetSize(XnUInt32 nSize, const T& fillVal)
+ {
+ //TODO: Shrink allocated array if new size is smaller
+ XnStatus nRetVal = SetMinSize(nSize, fillVal);
+ XN_IS_STATUS_OK(nRetVal);
+ m_nSize = nSize;
+ return XN_STATUS_OK;
+ }
+
+ /** Makes sure the array has at least nSize elements.
+ If nSize is less than the current size, there is no effect.
+ Note that for primitive types, any added elements are uninitialized. **/
+ XnStatus SetMinSize(XnUInt32 nSize)
+ {
+ if (nSize > m_nSize)
+ {
+ XnStatus nRetVal = Reserve(nSize);
+ XN_IS_STATUS_OK(nRetVal);
+ m_nSize = nSize;
+ }
+ return XN_STATUS_OK;
+ }
+
+ /** Makes sure the array has at least nSize elements.
+ If nSize is less than the current size, there is no effect.
+ Any added elements are initialized by the value specified by fillVal. **/
+ XnStatus SetMinSize(XnUInt32 nSize, const T& fillVal)
+ {
+ if (nSize > m_nSize)
+ {
+ XnStatus nRetVal = Reserve(nSize);
+ XN_IS_STATUS_OK(nRetVal);
+ for (XnUInt32 i = m_nSize; i < nSize; i++)
+ {
+ m_pData[i] = fillVal;
+ }
+ m_nSize = nSize;
+ }
+
+ return XN_STATUS_OK;
+ }
+
+ /** @returns The allocated size of this array. This is the maximum number of elements that the array can hold
+ without re-allocating and copying data. **/
+ XnUInt32 GetAllocatedSize() const
+ {
+ return m_nAllocatedSize;
+ }
+
+ /** Sets value at specified index, grows array if needed.
+ Note that when dealing with primitive types and adding beyond the current size of the array,
+ any added values that fill the gap are uninitialized**/
+ XnStatus Set(XnUInt32 nIndex, const T& val)
+ {
+ XnStatus nRetVal = SetMinSize(nIndex+1);
+ XN_IS_STATUS_OK(nRetVal);
+ m_pData[nIndex] = val;
+ return XN_STATUS_OK;
+ }
+
+ /** Sets value at specified index and grows array if needed, filling any resulting blank elements with fillVal. **/
+ XnStatus Set(XnUInt32 nIndex, const T& val, const T& fillVal)
+ {
+ XnStatus nRetVal = SetMinSize(nIndex+1, fillVal);
+ XN_IS_STATUS_OK(nRetVal);
+ m_pData[nIndex] = val;
+ return XN_STATUS_OK;
+ }
+
+ /** Adds one element to the end of this array. **/
+ XnStatus AddLast(const T& val)
+ {
+ return Set(m_nSize, val);
+ }
+
+ /** Adds a range of values to the end of this array. **/
+ XnStatus AddLast(const T* aValues, XnUInt32 nCount)
+ {
+ XN_VALIDATE_INPUT_PTR(aValues);
+ XnUInt32 nOffset = GetSize();
+ XnStatus nRetVal = SetMinSize(GetSize() + nCount);
+ XN_IS_STATUS_OK(nRetVal);
+ for (XnUInt32 i = 0; i < nCount; ++i)
+ {
+ m_pData[nOffset + i] = aValues[i];
+ }
+ return XN_STATUS_OK;
+ }
+
+ /** Resets the data of this array and sets its size to 0. **/
+ void Clear()
+ {
+ XN_DELETE_ARR(m_pData);
+ Init();
+ }
+
+ /** Element access operator. Returns a modifiable reference to the element at specified index. **/
+ T& operator[](XnUInt32 nIndex)
+ {
+ XN_ASSERT(nIndex < m_nSize);
+ return m_pData[nIndex];
+ }
+
+ /** Element access operator. Returns a const reference to the element at specified index. **/
+ const T& operator[](XnUInt32 nIndex) const
+ {
+ XN_ASSERT(nIndex < m_nSize);
+ return m_pData[nIndex];
+ }
+
+ /** @returns a modifiable iterator pointing to the beginning of this array. **/
+ Iterator begin()
+ {
+ return &m_pData[0];
+ }
+
+ /** @returns a const iterator pointing to the beginning of this array. **/
+ ConstIterator begin() const
+ {
+ return &m_pData[0];
+ }
+
+ /** @returns a modifiable itertor pointing to the end of this array. **/
+ Iterator end()
+ {
+ return m_pData + m_nSize;
+ }
+
+ /** @returns a const itertor pointing to the end of this array. **/
+ ConstIterator end() const
+ {
+ return m_pData + m_nSize;
+ }
+
+private:
+ void Init(XnUInt32 nBaseSize = BASE_SIZE)
+ {
+ m_pData = XN_NEW_ARR(T, nBaseSize);
+ m_nAllocatedSize = nBaseSize;
+ m_nSize = 0;
+ }
+
+ T* m_pData;
+ XnUInt32 m_nSize;
+ XnUInt32 m_nAllocatedSize;
+};
+
+#endif // __XNARRAY_H__ \ No newline at end of file