/******************************************************************************* Copyright (c) 2005-2009 David Williams This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. *******************************************************************************/ namespace PolyVox { template Array::Array() :m_pElements(0) ,m_pDimensions(0) ,m_pOffsets(0) ,m_uNoOfElements(0) { } template Array::Array(const uint32_t (&pDimensions)[noOfDims]) :m_pElements(0) ,m_pDimensions(0) ,m_pOffsets(0) ,m_uNoOfElements(0) { resize(pDimensions); } template Array::~Array() { deallocate(); } template SubArray Array::operator[](uint32_t uIndex) { assert(uIndex(&m_pElements[uIndex*m_pOffsets[0]], m_pDimensions+1, m_pOffsets+1); } template const SubArray Array::operator[](uint32_t uIndex) const { assert(uIndex(&m_pElements[uIndex*m_pOffsets[0]], m_pDimensions+1, m_pOffsets+1); } template uint32_t Array::getNoOfElements(void) const { return m_uNoOfElements; } template ElementType* Array::getRawData(void) const { return m_pElements; } template void Array::resize(const uint32_t (&pDimensions)[noOfDims]) { deallocate(); m_pDimensions = new uint32_t[noOfDims]; m_pOffsets = new uint32_t[noOfDims]; // Calculate all the information you need to use the array m_uNoOfElements = 1; for (uint32_t i = 0; ii; k--) { m_pOffsets[i] *= pDimensions[k]; } } // Allocate new elements, let exception propagate m_pElements = new ElementType[m_uNoOfElements]; } template void Array::swap(Array& rhs) { //Implement this function without temporary 'Array' //objects, as the destructors will free the memory... uint32_t* m_pTempDimensions = m_pDimensions; uint32_t* m_pTempOffsets = m_pOffsets; uint32_t m_uTempNoOfElements = m_uNoOfElements; ElementType* m_pTempElements = m_pElements; m_pDimensions = rhs.m_pDimensions; m_pOffsets = rhs.m_pOffsets; m_uNoOfElements = rhs.m_uNoOfElements; m_pElements = rhs.m_pElements; rhs.m_pDimensions = m_pTempDimensions; rhs.m_pOffsets = m_pTempOffsets; rhs.m_uNoOfElements = m_uTempNoOfElements; rhs.m_pElements = m_pTempElements; } template Array::Array(const Array& rhs) :m_pElements(0) ,m_pDimensions(0) ,m_pOffsets(0) ,m_uNoOfElements(0) { //Not implemented assert(false); } template Array& Array::operator=(const Array& rhs) { //Not implemented assert(false); return *this; } template void Array::deallocate(void) { delete[] m_pDimensions; m_pDimensions = 0; delete[] m_pOffsets; m_pOffsets = 0; delete[] m_pElements; m_pElements = 0; m_uNoOfElements = 0; } //////////////////////////////////////////////////////////////////////////////// template Array<1, ElementType>::Array() : m_pElements(0) ,m_pDimensions(0) { } template Array<1, ElementType>::Array(const uint32_t (&pDimensions)[1]) : m_pElements(0) ,m_pDimensions(0) { resize(pDimensions); } template Array<1, ElementType>::~Array() { deallocate(); } template ElementType& Array<1, ElementType>::operator[] (uint32_t uIndex) { assert(uIndex const ElementType& Array<1, ElementType>::operator[] (uint32_t uIndex) const { assert(uIndex uint32_t Array<1, ElementType>::getNoOfElements(void) const { return m_pDimensions[0]; } template ElementType* Array<1, ElementType>::getRawData(void) const { return m_pElements; } template void Array<1, ElementType>::resize(const uint32_t (&pDimensions)[1]) { deallocate(); m_pDimensions = new uint32_t[1]; m_pDimensions[0] = pDimensions[0]; // Allocate new elements, let exception propagate m_pElements = new ElementType[m_pDimensions[0]]; } template void Array<1, ElementType>::swap(Array<1, ElementType>& rhs) { //Implement this function without temporary 'Array' //objects, as the destructors will free the memory... uint32_t* m_pTempDimensions = m_pDimensions; ElementType* m_pTempElements = m_pElements; m_pDimensions = rhs.m_pDimensions; m_pElements = rhs.m_pElements; rhs.m_pDimensions = m_pTempDimensions; rhs.m_pElements = m_pTempElements; } template Array<1, ElementType>::Array(const Array<1, ElementType>& rhs) : m_pElements(0) ,m_pDimensions(0) { //Not implemented assert(false); } template Array<1, ElementType>& Array<1, ElementType>::operator=(const Array<1, ElementType>& rhs) { //Not implemented assert(false); return *this; } template void Array<1, ElementType>::deallocate(void) { delete[] m_pDimensions; m_pDimensions = 0; delete[] m_pElements; m_pElements = 0; } }//namespace PolyVox