diff -r 0be82064630b -r 2bf8a359aa2f egl/sfopenvg/riArray.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/egl/sfopenvg/riArray.h Wed May 12 11:20:41 2010 +0100 @@ -0,0 +1,211 @@ +#ifndef __RIARRAY_H +#define __RIARRAY_H + +/*------------------------------------------------------------------------ + * + * OpenVG 1.1 Reference Implementation + * ----------------------------------- + * + * Copyright (c) 2007 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and /or associated documentation files + * (the "Materials "), to deal in the Materials without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Materials, + * and to permit persons to whom the Materials are furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Materials. + * + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR + * THE USE OR OTHER DEALINGS IN THE MATERIALS. + * + *//** + * \file + * \brief Array class. + * \note + *//*-------------------------------------------------------------------*/ + +#ifndef __RIDEFS_H +#include "riDefs.h" +#endif + +#include //for memcpy + +namespace OpenVGRI +{ + +//======================================================================= + +/*-------------------------------------------------------------------*//*! +* \brief An array class similar to std::vector. +* \param +* \return +* \note Follows std::vector's naming convention (except resizeAndReallocate). +*//*-------------------------------------------------------------------*/ + +template class Array +{ +public: + Array() : m_array(NULL), m_size(0), m_allocated(0) {} //throws bad_alloc + ~Array() + { + RI_DELETE_ARRAY(m_array); + } + + void swap(Array& s) + { + Item* tarray = m_array; + m_array = s.m_array; + s.m_array = tarray; + + int tsize = m_size; + m_size = s.m_size; + s.m_size = tsize; + + int tallocated = m_allocated; + m_allocated = s.m_allocated; + s.m_allocated = tallocated; + } + + //if more room is needed, reallocate, otherwise return + void reserve( int items ) //throws bad_alloc + { + RI_ASSERT( items >= 0 ); + if( items <= m_allocated ) + return; //if there is room already, return + + RI_ASSERT( items > m_allocated ); + + Item* newa = RI_NEW_ARRAY(Item, items); //throws bad_alloc if runs out of memory + for(int i=0;i= 0 ); + if( items == m_allocated ) + { + m_size = items; + return; + } + + if( items == 0 ) + { + RI_DELETE_ARRAY(m_array); + m_size = 0; + m_allocated = 0; + return; + } + + Item* newa = RI_NEW_ARRAY(Item, items); //throws bad_alloc if runs out of memory + int copySize = (m_size < items) ? m_size : items; //min(m_size,items) + for(int i=0;i for decreasing.) + void sort() + { + if(m_size <= 1) + return; + quicksort(0, m_size - 1); + } + + //remove the first occurrence of an item from the array + bool remove(const Item& item) + { + int i=0; + for(;i= m_size) + return false; //not found + for(;i= m_allocated ) + reserve( (!m_allocated) ? 8 : m_allocated * 2 ); //by default, reserve 8. throws bad_alloc if runs out of memory + m_array[m_size++] = item; + } + RI_INLINE int size() const { return m_size; } + RI_INLINE Item& operator[](int i) { RI_ASSERT(i >= 0 && i < m_size); return m_array[i]; } + RI_INLINE const Item& operator[](int i) const { RI_ASSERT(i >= 0 && i < m_size); return m_array[i]; } + +private: + Array(const Array& s); //!< Not allowed. + void operator=(const Array& s); //!< Not allowed. + + void quicksort(int left, int right) + { + int i = left, j = right; + Item x = m_array[(left+right)>>1]; + + do + { + while (m_array[i] < x) + i++; + while (x < m_array[j]) + j--; + if (i<=j) + { + Item tmp = m_array[i]; + m_array[i] = m_array[j]; + m_array[j] = tmp; + i++; + j--; + } + } while (i<=j); + + if(left < j) quicksort(left, j); + if(i < right) quicksort(i, right); + } + + + Item* m_array; + int m_size; + int m_allocated; +}; + +//======================================================================= + +} //namespace OpenVGRI + +#endif /* __RIARRAY_H */