diff --git a/library/PolyVoxCore/CMakeLists.txt b/library/PolyVoxCore/CMakeLists.txt index 52b22299..c0d84641 100644 --- a/library/PolyVoxCore/CMakeLists.txt +++ b/library/PolyVoxCore/CMakeLists.txt @@ -55,6 +55,8 @@ SET(IMPL_INC_FILES include/PolyVoxImpl/Block.inl include/PolyVoxImpl/CPlusPlusZeroXSupport.h include/PolyVoxImpl/MarchingCubesTables.h + include/PolyVoxImpl/SubArray.h + include/PolyVoxImpl/SubArray.inl include/PolyVoxImpl/TypeDef.h include/PolyVoxImpl/Utility.h ) diff --git a/library/PolyVoxCore/include/Array.h b/library/PolyVoxCore/include/Array.h index f4700d98..24266b82 100644 --- a/library/PolyVoxCore/include/Array.h +++ b/library/PolyVoxCore/include/Array.h @@ -29,7 +29,7 @@ freely, subject to the following restrictions: #pragma region Headers #include "ArraySizes.h" //Not strictly required, but convienient -#include "PolyVoxImpl/TypeDef.h" +#include "PolyVoxImpl/SubArray.h" #include "PolyVoxImpl/CPlusPlusZeroXSupport.h" #pragma endregion @@ -38,10 +38,8 @@ namespace PolyVox template class Array { - friend class Array; - public: - Array(const uint32_t (&Dimensions)[noOfDims]) + Array(const uint32_t (&pDimensions)[noOfDims]) :m_pElements(0) ,m_pDimensions(0) ,m_pOffsets(0) @@ -54,33 +52,40 @@ namespace PolyVox m_uNoOfElements = 1; for (uint32_t i = 0; ii; k--) { - m_pOffsets[i] *= Dimensions[k]; + m_pOffsets[i] *= pDimensions[k]; } } // Allocate new elements, let exception propagate m_pElements = new ElementType[m_uNoOfElements]; } - Array operator [](uint32_t uIndex) + ~Array() + { + delete[] m_pDimensions; + delete[] m_pOffsets; + delete[] m_pElements; + } + + SubArray operator [](uint32_t uIndex) { assert(uIndex(&m_pElements[uIndex*m_pOffsets[0]], + SubArray(&m_pElements[uIndex*m_pOffsets[0]], m_pDimensions+1, m_pOffsets+1); } - const Array operator [](uint32_t uIndex) const + const SubArray operator [](uint32_t uIndex) const { assert(uIndex(&m_pElements[uIndex*m_pOffsets[0]], + SubArray(&m_pElements[uIndex*m_pOffsets[0]], m_pDimensions+1, m_pOffsets+1); } @@ -95,14 +100,6 @@ namespace PolyVox } private: - Array(ElementType * pElements, uint32_t * pDimensions, uint32_t * pOffsets) - :m_pElements(pElements) - ,m_pDimensions(pDimensions) - ,m_pOffsets(pOffsets) - ,m_uNoOfElements(0) - { - } - uint32_t * m_pDimensions; uint32_t * m_pOffsets; uint32_t m_uNoOfElements; @@ -112,15 +109,13 @@ namespace PolyVox template class Array<1, ElementType> { - friend class Array<2, ElementType>; - public: - Array<1, ElementType>(const uint32_t (&Dimensions)[1]) + Array<1, ElementType>(const uint32_t (&pDimensions)[1]) : m_pElements(0) ,m_pDimensions(0) { m_pDimensions = new uint32_t[1]; - m_pDimensions[0] = Dimensions[0]; + m_pDimensions[0] = pDimensions[0]; // Allocate new elements, let exception propagate m_pElements = new ElementType[m_pDimensions[0]]; @@ -149,12 +144,6 @@ namespace PolyVox } private: - Array<1, ElementType>(ElementType * pElements, uint32_t * pDimensions, uint32_t * /*pOffsets*/) - :m_pDimensions(pDimensions) - ,m_pElements(pElements) - { - } - uint32_t * m_pDimensions; ElementType * m_pElements; }; diff --git a/library/PolyVoxCore/include/PolyVoxImpl/SubArray.h b/library/PolyVoxCore/include/PolyVoxImpl/SubArray.h new file mode 100644 index 00000000..4b2d0d49 --- /dev/null +++ b/library/PolyVoxCore/include/PolyVoxImpl/SubArray.h @@ -0,0 +1,114 @@ +#pragma region License +/******************************************************************************* +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. +*******************************************************************************/ +#pragma endregion + +#ifndef __PolyVox_SubArray_H__ +#define __PolyVox_SubArray_H__ + +#pragma region Headers +#include "PolyVoxImpl/CPlusPlusZeroXSupport.h" +#pragma endregion + +namespace PolyVox +{ + template class Array; + + template + class SubArray + { + friend class Array; + friend class SubArray; + + public: + SubArray operator [](uint32_t uIndex) + { + assert(uIndex(&m_pElements[uIndex*m_pOffsets[0]], + m_pDimensions+1, m_pOffsets+1); + } + + const SubArray operator [](uint32_t uIndex) const + { + assert(uIndex(&m_pElements[uIndex*m_pOffsets[0]], + m_pDimensions+1, m_pOffsets+1); + } + + private: + SubArray(ElementType * pElements, uint32_t * pDimensions, uint32_t * pOffsets) + :m_pElements(pElements) + ,m_pDimensions(pDimensions) + ,m_pOffsets(pOffsets) + ,m_uNoOfElements(0) + { + } + + uint32_t * m_pDimensions; + uint32_t * m_pOffsets; + uint32_t m_uNoOfElements; + ElementType * m_pElements; + }; + + template + class SubArray<1, ElementType> + { + friend class Array<2, ElementType>; + friend class SubArray<2, ElementType>; + + public: + ElementType & operator [] (uint32_t uIndex) + { + assert(uIndex(ElementType * pElements, uint32_t * pDimensions, uint32_t * /*pOffsets*/) + :m_pDimensions(pDimensions) + ,m_pElements(pElements) + { + } + + uint32_t * m_pDimensions; + ElementType * m_pElements; + }; + + template + class SubArray<0, ElementType> + { + //Zero dimensional subarray is meaningless. + }; +}//namespace PolyVox + +#include "SubArray.inl" + +#endif //__PolyVox_SubArray_H__ \ No newline at end of file diff --git a/library/PolyVoxCore/include/PolyVoxImpl/SubArray.inl b/library/PolyVoxCore/include/PolyVoxImpl/SubArray.inl new file mode 100644 index 00000000..e69de29b