summaryrefslogtreecommitdiff
path: root/thirdparty/bullet/BulletCollision/Gimpact/gim_array.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/bullet/BulletCollision/Gimpact/gim_array.h')
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_array.h324
1 files changed, 324 insertions, 0 deletions
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_array.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_array.h
new file mode 100644
index 0000000000..cda51a5fce
--- /dev/null
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_array.h
@@ -0,0 +1,324 @@
+#ifndef GIM_ARRAY_H_INCLUDED
+#define GIM_ARRAY_H_INCLUDED
+/*! \file gim_array.h
+\author Francisco Leon Najera
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+ (3) The zlib/libpng license that is included with this library in
+ the file GIMPACT-LICENSE-ZLIB.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT, GIMPACT-LICENSE-ZLIB.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+#include "gim_memory.h"
+
+
+#define GIM_ARRAY_GROW_INCREMENT 2
+#define GIM_ARRAY_GROW_FACTOR 2
+
+//! Very simple array container with fast access and simd memory
+template<typename T>
+class gim_array
+{
+public:
+//! properties
+//!@{
+ T *m_data;
+ GUINT m_size;
+ GUINT m_allocated_size;
+//!@}
+//! protected operations
+//!@{
+
+ inline void destroyData()
+ {
+ m_allocated_size = 0;
+ if(m_data==NULL) return;
+ gim_free(m_data);
+ m_data = NULL;
+ }
+
+ inline bool resizeData(GUINT newsize)
+ {
+ if(newsize==0)
+ {
+ destroyData();
+ return true;
+ }
+
+ if(m_size>0)
+ {
+ m_data = (T*)gim_realloc(m_data,m_size*sizeof(T),newsize*sizeof(T));
+ }
+ else
+ {
+ m_data = (T*)gim_alloc(newsize*sizeof(T));
+ }
+ m_allocated_size = newsize;
+ return true;
+ }
+
+ inline bool growingCheck()
+ {
+ if(m_allocated_size<=m_size)
+ {
+ GUINT requestsize = m_size;
+ m_size = m_allocated_size;
+ if(resizeData((requestsize+GIM_ARRAY_GROW_INCREMENT)*GIM_ARRAY_GROW_FACTOR)==false) return false;
+ }
+ return true;
+ }
+
+//!@}
+//! public operations
+//!@{
+ inline bool reserve(GUINT size)
+ {
+ if(m_allocated_size>=size) return false;
+ return resizeData(size);
+ }
+
+ inline void clear_range(GUINT start_range)
+ {
+ while(m_size>start_range)
+ {
+ m_data[--m_size].~T();
+ }
+ }
+
+ inline void clear()
+ {
+ if(m_size==0)return;
+ clear_range(0);
+ }
+
+ inline void clear_memory()
+ {
+ clear();
+ destroyData();
+ }
+
+ gim_array()
+ {
+ m_data = 0;
+ m_size = 0;
+ m_allocated_size = 0;
+ }
+
+ gim_array(GUINT reservesize)
+ {
+ m_data = 0;
+ m_size = 0;
+
+ m_allocated_size = 0;
+ reserve(reservesize);
+ }
+
+ ~gim_array()
+ {
+ clear_memory();
+ }
+
+ inline GUINT size() const
+ {
+ return m_size;
+ }
+
+ inline GUINT max_size() const
+ {
+ return m_allocated_size;
+ }
+
+ inline T & operator[](size_t i)
+ {
+ return m_data[i];
+ }
+ inline const T & operator[](size_t i) const
+ {
+ return m_data[i];
+ }
+
+ inline T * pointer(){ return m_data;}
+ inline const T * pointer() const
+ { return m_data;}
+
+
+ inline T * get_pointer_at(GUINT i)
+ {
+ return m_data + i;
+ }
+
+ inline const T * get_pointer_at(GUINT i) const
+ {
+ return m_data + i;
+ }
+
+ inline T & at(GUINT i)
+ {
+ return m_data[i];
+ }
+
+ inline const T & at(GUINT i) const
+ {
+ return m_data[i];
+ }
+
+ inline T & front()
+ {
+ return *m_data;
+ }
+
+ inline const T & front() const
+ {
+ return *m_data;
+ }
+
+ inline T & back()
+ {
+ return m_data[m_size-1];
+ }
+
+ inline const T & back() const
+ {
+ return m_data[m_size-1];
+ }
+
+
+ inline void swap(GUINT i, GUINT j)
+ {
+ gim_swap_elements(m_data,i,j);
+ }
+
+ inline void push_back(const T & obj)
+ {
+ this->growingCheck();
+ m_data[m_size] = obj;
+ m_size++;
+ }
+
+ //!Simply increase the m_size, doesn't call the new element constructor
+ inline void push_back_mem()
+ {
+ this->growingCheck();
+ m_size++;
+ }
+
+ inline void push_back_memcpy(const T & obj)
+ {
+ this->growingCheck();
+ gim_simd_memcpy(&m_data[m_size],&obj,sizeof(T));
+ m_size++;
+ }
+
+ inline void pop_back()
+ {
+ m_size--;
+ m_data[m_size].~T();
+ }
+
+ //!Simply decrease the m_size, doesn't call the deleted element destructor
+ inline void pop_back_mem()
+ {
+ m_size--;
+ }
+
+ //! fast erase
+ inline void erase(GUINT index)
+ {
+ if(index<m_size-1)
+ {
+ swap(index,m_size-1);
+ }
+ pop_back();
+ }
+
+ inline void erase_sorted_mem(GUINT index)
+ {
+ m_size--;
+ for(GUINT i = index;i<m_size;i++)
+ {
+ gim_simd_memcpy(m_data+i,m_data+i+1,sizeof(T));
+ }
+ }
+
+ inline void erase_sorted(GUINT index)
+ {
+ m_data[index].~T();
+ erase_sorted_mem(index);
+ }
+
+ inline void insert_mem(GUINT index)
+ {
+ this->growingCheck();
+ for(GUINT i = m_size;i>index;i--)
+ {
+ gim_simd_memcpy(m_data+i,m_data+i-1,sizeof(T));
+ }
+ m_size++;
+ }
+
+ inline void insert(const T & obj,GUINT index)
+ {
+ insert_mem(index);
+ m_data[index] = obj;
+ }
+
+ inline void resize(GUINT size, bool call_constructor = true, const T& fillData=T())
+ {
+ if(size>m_size)
+ {
+ reserve(size);
+ if(call_constructor)
+ {
+ while(m_size<size)
+ {
+ m_data[m_size] = fillData;
+ m_size++;
+ }
+ }
+ else
+ {
+ m_size = size;
+ }
+ }
+ else if(size<m_size)
+ {
+ if(call_constructor) clear_range(size);
+ m_size = size;
+ }
+ }
+
+ inline void refit()
+ {
+ resizeData(m_size);
+ }
+
+};
+
+
+
+
+
+#endif // GIM_CONTAINERS_H_INCLUDED