aboutsummaryrefslogtreecommitdiff
path: root/core/dvector.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--core/dvector.h239
1 files changed, 107 insertions, 132 deletions
diff --git a/core/dvector.h b/core/dvector.h
index 47883b23b..2c58b4a31 100644
--- a/core/dvector.h
+++ b/core/dvector.h
@@ -31,20 +31,17 @@
#include "os/memory.h"
-
/**
@author Juan Linietsky <reduzio@gmail.com>
*/
+extern Mutex *dvector_lock;
-extern Mutex* dvector_lock;
-
-template<class T>
+template <class T>
class DVector {
mutable MID mem;
-
void copy_on_write() {
if (!mem.is_valid())
@@ -53,56 +50,54 @@ class DVector {
if (dvector_lock)
dvector_lock->lock();
- MID_Lock lock( mem );
-
+ MID_Lock lock(mem);
- if ( *(int*)lock.data() == 1 ) {
+ if (*(int *)lock.data() == 1) {
// one reference, means no refcount changes
if (dvector_lock)
dvector_lock->unlock();
return;
}
- MID new_mem= dynalloc( mem.get_size() );
+ MID new_mem = dynalloc(mem.get_size());
if (!new_mem.is_valid()) {
if (dvector_lock)
dvector_lock->unlock();
- ERR_FAIL_COND( new_mem.is_valid() ); // out of memory
+ ERR_FAIL_COND(new_mem.is_valid()); // out of memory
}
- MID_Lock dst_lock( new_mem );
+ MID_Lock dst_lock(new_mem);
- int *rc = (int*)dst_lock.data();
+ int *rc = (int *)dst_lock.data();
- *rc=1;
+ *rc = 1;
- T * dst = (T*)(rc + 1 );
+ T *dst = (T *)(rc + 1);
- T * src =(T*) ((int*)lock.data() + 1 );
+ T *src = (T *)((int *)lock.data() + 1);
int count = (mem.get_size() - sizeof(int)) / sizeof(T);
- for (int i=0;i<count;i++) {
+ for (int i = 0; i < count; i++) {
- memnew_placement( &dst[i], T(src[i]) );
+ memnew_placement(&dst[i], T(src[i]));
}
- (*(int*)lock.data())--;
+ (*(int *)lock.data())--;
// unlock all
- dst_lock=MID_Lock();
- lock=MID_Lock();
+ dst_lock = MID_Lock();
+ lock = MID_Lock();
- mem=new_mem;
+ mem = new_mem;
if (dvector_lock)
dvector_lock->unlock();
-
}
- void reference( const DVector& p_dvector ) {
+ void reference(const DVector &p_dvector) {
unreference();
@@ -118,18 +113,16 @@ class DVector {
MID_Lock lock(p_dvector.mem);
- int * rc = (int*)lock.data();
+ int *rc = (int *)lock.data();
(*rc)++;
lock = MID_Lock();
- mem=p_dvector.mem;
+ mem = p_dvector.mem;
if (dvector_lock)
dvector_lock->unlock();
-
}
-
void unreference() {
if (dvector_lock)
@@ -144,65 +137,60 @@ class DVector {
MID_Lock lock(mem);
- int * rc = (int*)lock.data();
+ int *rc = (int *)lock.data();
(*rc)--;
- if (*rc==0) {
+ if (*rc == 0) {
// no one else using it, destruct
- T * t= (T*)(rc+1);
+ T *t = (T *)(rc + 1);
int count = (mem.get_size() - sizeof(int)) / sizeof(T);
- for (int i=0;i<count;i++) {
+ for (int i = 0; i < count; i++) {
t[i].~T();
}
-
}
-
lock = MID_Lock();
- mem = MID ();
+ mem = MID();
if (dvector_lock)
dvector_lock->unlock();
-
}
public:
-
class Read {
- friend class DVector;
+ friend class DVector;
MID_Lock lock;
- const T * mem;
- public:
+ const T *mem;
- _FORCE_INLINE_ const T& operator[](int p_index) const { return mem[p_index]; }
+ public:
+ _FORCE_INLINE_ const T &operator[](int p_index) const { return mem[p_index]; }
_FORCE_INLINE_ const T *ptr() const { return mem; }
- Read() { mem=NULL; }
+ Read() { mem = NULL; }
};
class Write {
- friend class DVector;
+ friend class DVector;
MID_Lock lock;
- T * mem;
- public:
+ T *mem;
- _FORCE_INLINE_ T& operator[](int p_index) { return mem[p_index]; }
+ public:
+ _FORCE_INLINE_ T &operator[](int p_index) { return mem[p_index]; }
_FORCE_INLINE_ T *ptr() { return mem; }
- Write() { mem=NULL; }
+ Write() { mem = NULL; }
};
-
Read read() const {
Read r;
if (mem.is_valid()) {
- r.lock = MID_Lock( mem );
- r.mem = (const T*)((int*)r.lock.data()+1);
+ r.lock = MID_Lock(mem);
+ r.mem = (const T *)((int *)r.lock.data() + 1);
}
return r;
}
@@ -211,74 +199,70 @@ public:
Write w;
if (mem.is_valid()) {
copy_on_write();
- w.lock = MID_Lock( mem );
- w.mem = (T*)((int*)w.lock.data()+1);
+ w.lock = MID_Lock(mem);
+ w.mem = (T *)((int *)w.lock.data() + 1);
}
return w;
}
- template<class MC>
- void fill_with(const MC& p_mc) {
-
+ template <class MC>
+ void fill_with(const MC &p_mc) {
- int c=p_mc.size();
+ int c = p_mc.size();
resize(c);
- Write w=write();
- int idx=0;
- for(const typename MC::Element *E=p_mc.front();E;E=E->next()) {
+ Write w = write();
+ int idx = 0;
+ for (const typename MC::Element *E = p_mc.front(); E; E = E->next()) {
- w[idx++]=E->get();
+ w[idx++] = E->get();
}
}
-
void remove(int p_index) {
int s = size();
ERR_FAIL_INDEX(p_index, s);
Write w = write();
- for (int i=p_index; i<s-1; i++) {
+ for (int i = p_index; i < s - 1; i++) {
- w[i]=w[i+1];
+ w[i] = w[i + 1];
};
w = Write();
- resize(s-1);
+ resize(s - 1);
}
inline int size() const;
T get(int p_index) const;
- void set(int p_index, const T& p_val);
- void push_back(const T& p_val);
- void append(const T& p_val) { push_back(p_val); }
- void append_array(const DVector<T>& p_arr) {
+ void set(int p_index, const T &p_val);
+ void push_back(const T &p_val);
+ void append(const T &p_val) { push_back(p_val); }
+ void append_array(const DVector<T> &p_arr) {
int ds = p_arr.size();
- if (ds==0)
+ if (ds == 0)
return;
int bs = size();
- resize( bs + ds);
+ resize(bs + ds);
Write w = write();
Read r = p_arr.read();
- for(int i=0;i<ds;i++)
- w[bs+i]=r[i];
+ for (int i = 0; i < ds; i++)
+ w[bs + i] = r[i];
}
+ Error insert(int p_pos, const T &p_val) {
- Error insert(int p_pos,const T& p_val) {
-
- int s=size();
- ERR_FAIL_INDEX_V(p_pos,s+1,ERR_INVALID_PARAMETER);
- resize(s+1);
+ int s = size();
+ ERR_FAIL_INDEX_V(p_pos, s + 1, ERR_INVALID_PARAMETER);
+ resize(s + 1);
{
Write w = write();
- for (int i=s;i>p_pos;i--)
- w[i]=w[i-1];
- w[p_pos]=p_val;
+ for (int i = s; i > p_pos; i--)
+ w[i] = w[i - 1];
+ w[p_pos] = p_val;
}
return OK;
}
-
bool is_locked() const { return mem.is_locked(); }
inline const T operator[](int p_index) const;
@@ -287,49 +271,48 @@ public:
void invert();
- void operator=(const DVector& p_dvector) { reference(p_dvector); }
+ void operator=(const DVector &p_dvector) { reference(p_dvector); }
DVector() {}
- DVector(const DVector& p_dvector) { reference(p_dvector); }
+ DVector(const DVector &p_dvector) { reference(p_dvector); }
~DVector() { unreference(); }
-
};
-template<class T>
+template <class T>
int DVector<T>::size() const {
- return mem.is_valid() ? ((mem.get_size() - sizeof(int)) / sizeof(T) ) : 0;
+ return mem.is_valid() ? ((mem.get_size() - sizeof(int)) / sizeof(T)) : 0;
}
-template<class T>
+template <class T>
T DVector<T>::get(int p_index) const {
return operator[](p_index);
}
-template<class T>
-void DVector<T>::set(int p_index, const T& p_val) {
+template <class T>
+void DVector<T>::set(int p_index, const T &p_val) {
- if (p_index<0 || p_index>=size()) {
- ERR_FAIL_COND(p_index<0 || p_index>=size());
+ if (p_index < 0 || p_index >= size()) {
+ ERR_FAIL_COND(p_index < 0 || p_index >= size());
}
Write w = write();
- w[p_index]=p_val;
+ w[p_index] = p_val;
}
-template<class T>
-void DVector<T>::push_back(const T& p_val) {
+template <class T>
+void DVector<T>::push_back(const T &p_val) {
- resize( size() + 1 );
- set( size() -1, p_val );
+ resize(size() + 1);
+ set(size() - 1, p_val);
}
-template<class T>
+template <class T>
const T DVector<T>::operator[](int p_index) const {
- if (p_index<0 || p_index>=size()) {
- T& aux=*((T*)0); //nullreturn
- ERR_FAIL_COND_V(p_index<0 || p_index>=size(),aux);
+ if (p_index < 0 || p_index >= size()) {
+ T &aux = *((T *)0); //nullreturn
+ ERR_FAIL_COND_V(p_index < 0 || p_index >= size(), aux);
}
Read r = read();
@@ -337,14 +320,13 @@ const T DVector<T>::operator[](int p_index) const {
return r[p_index];
}
-
-template<class T>
+template <class T>
Error DVector<T>::resize(int p_size) {
if (dvector_lock)
dvector_lock->lock();
- bool same = p_size==size();
+ bool same = p_size == size();
if (dvector_lock)
dvector_lock->unlock();
@@ -353,89 +335,82 @@ Error DVector<T>::resize(int p_size) {
if (same)
return OK;
- if (p_size == 0 ) {
+ if (p_size == 0) {
unreference();
return OK;
}
-
copy_on_write(); // make it unique
- ERR_FAIL_COND_V( mem.is_locked(), ERR_LOCKED ); // if after copy on write, memory is locked, fail.
+ ERR_FAIL_COND_V(mem.is_locked(), ERR_LOCKED); // if after copy on write, memory is locked, fail.
- if (p_size > size() ) {
+ if (p_size > size()) {
- int oldsize=size();
+ int oldsize = size();
MID_Lock lock;
- if (oldsize==0) {
+ if (oldsize == 0) {
- mem = dynalloc( p_size * sizeof(T) + sizeof(int) );
- lock=MID_Lock(mem);
- int *rc = ((int*)lock.data());
- *rc=1;
+ mem = dynalloc(p_size * sizeof(T) + sizeof(int));
+ lock = MID_Lock(mem);
+ int *rc = ((int *)lock.data());
+ *rc = 1;
} else {
- if (dynrealloc( mem, p_size * sizeof(T) + sizeof(int) )!=OK ) {
+ if (dynrealloc(mem, p_size * sizeof(T) + sizeof(int)) != OK) {
ERR_FAIL_V(ERR_OUT_OF_MEMORY); // out of memory
}
- lock=MID_Lock(mem);
+ lock = MID_Lock(mem);
}
+ T *t = (T *)((int *)lock.data() + 1);
+ for (int i = oldsize; i < p_size; i++) {
-
- T *t = (T*)((int*)lock.data() + 1);
-
- for (int i=oldsize;i<p_size;i++) {
-
- memnew_placement(&t[i], T );
+ memnew_placement(&t[i], T);
}
lock = MID_Lock(); // clear
} else {
- int oldsize=size();
+ int oldsize = size();
MID_Lock lock(mem);
+ T *t = (T *)((int *)lock.data() + 1);
- T *t = (T*)((int*)lock.data() + 1);
-
- for (int i=p_size;i<oldsize;i++) {
+ for (int i = p_size; i < oldsize; i++) {
t[i].~T();
}
lock = MID_Lock(); // clear
- if (dynrealloc( mem, p_size * sizeof(T) + sizeof(int) )!=OK ) {
+ if (dynrealloc(mem, p_size * sizeof(T) + sizeof(int)) != OK) {
ERR_FAIL_V(ERR_OUT_OF_MEMORY); // wtf error
}
-
-
}
return OK;
}
-template<class T>
+template <class T>
void DVector<T>::invert() {
T temp;
Write w = write();
int s = size();
- int half_s = s/2;
+ int half_s = s / 2;
- for(int i=0;i<half_s;i++) {
+ for (int i = 0; i < half_s; i++) {
temp = w[i];
- w[i] = w[s-i-1];
- w[s-i-1] = temp;
+ w[i] = w[s - i - 1];
+ w[s - i - 1] = temp;
}
}