From 7028cbe09c688437910a25623098762bf0fa592d Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Mon, 28 Mar 2016 22:28:34 +1000 Subject: Move Irrlicht to src/others. --- .../doc/html/irr_array_8h_source.html | 643 +++++++++++++++++++++ 1 file changed, 643 insertions(+) create mode 100644 src/others/irrlicht-1.8.1/doc/html/irr_array_8h_source.html (limited to 'src/others/irrlicht-1.8.1/doc/html/irr_array_8h_source.html') diff --git a/src/others/irrlicht-1.8.1/doc/html/irr_array_8h_source.html b/src/others/irrlicht-1.8.1/doc/html/irr_array_8h_source.html new file mode 100644 index 0000000..b6e4ed9 --- /dev/null +++ b/src/others/irrlicht-1.8.1/doc/html/irr_array_8h_source.html @@ -0,0 +1,643 @@ + + + + +Irrlicht 3D Engine: irrArray.h Source File + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + +
+
Irrlicht 3D Engine + +
+ +
+ + + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+
+
+
irrArray.h
+
+
+Go to the documentation of this file.
00001 // Copyright (C) 2002-2012 Nikolaus Gebhardt
+00002 // This file is part of the "Irrlicht Engine" and the "irrXML" project.
+00003 // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h
+00004 
+00005 #ifndef __IRR_ARRAY_H_INCLUDED__
+00006 #define __IRR_ARRAY_H_INCLUDED__
+00007 
+00008 #include "irrTypes.h"
+00009 #include "heapsort.h"
+00010 #include "irrAllocator.h"
+00011 #include "irrMath.h"
+00012 
+00013 namespace irr
+00014 {
+00015 namespace core
+00016 {
+00017 
+00019 
+00021 template <class T, typename TAlloc = irrAllocator<T> >
+00022 class array
+00023 {
+00024 
+00025 public:
+00026 
+00028     array()
+00029         : data(0), allocated(0), used(0),
+00030             strategy(ALLOC_STRATEGY_DOUBLE), free_when_destroyed(true), is_sorted(true)
+00031     {
+00032     }
+00033 
+00034 
+00036 
+00037     array(u32 start_count)
+00038       : data(0), allocated(0), used(0),
+00039         strategy(ALLOC_STRATEGY_DOUBLE), free_when_destroyed(true), is_sorted(true)
+00040     {
+00041         reallocate(start_count);
+00042     }
+00043 
+00044 
+00046     array(const array<T, TAlloc>& other) : data(0)
+00047     {
+00048         *this = other;
+00049     }
+00050 
+00051 
+00053 
+00055     ~array()
+00056     {
+00057         clear();
+00058     }
+00059 
+00060 
+00062 
+00067     void reallocate(u32 new_size, bool canShrink=true)
+00068     {
+00069         if (allocated==new_size)
+00070             return;
+00071         if (!canShrink && (new_size < allocated))
+00072             return;
+00073 
+00074         T* old_data = data;
+00075 
+00076         data = allocator.allocate(new_size); //new T[new_size];
+00077         allocated = new_size;
+00078 
+00079         // copy old data
+00080         s32 end = used < new_size ? used : new_size;
+00081 
+00082         for (s32 i=0; i<end; ++i)
+00083         {
+00084             // data[i] = old_data[i];
+00085             allocator.construct(&data[i], old_data[i]);
+00086         }
+00087 
+00088         // destruct old data
+00089         for (u32 j=0; j<used; ++j)
+00090             allocator.destruct(&old_data[j]);
+00091 
+00092         if (allocated < used)
+00093             used = allocated;
+00094 
+00095         allocator.deallocate(old_data); //delete [] old_data;
+00096     }
+00097 
+00098 
+00100 
+00103     void setAllocStrategy ( eAllocStrategy newStrategy = ALLOC_STRATEGY_DOUBLE )
+00104     {
+00105         strategy = newStrategy;
+00106     }
+00107 
+00108 
+00110 
+00112     void push_back(const T& element)
+00113     {
+00114         insert(element, used);
+00115     }
+00116 
+00117 
+00119 
+00123     void push_front(const T& element)
+00124     {
+00125         insert(element);
+00126     }
+00127 
+00128 
+00130 
+00135     void insert(const T& element, u32 index=0)
+00136     {
+00137         _IRR_DEBUG_BREAK_IF(index>used) // access violation
+00138 
+00139         if (used + 1 > allocated)
+00140         {
+00141             // this doesn't work if the element is in the same
+00142             // array. So we'll copy the element first to be sure
+00143             // we'll get no data corruption
+00144             const T e(element);
+00145 
+00146             // increase data block
+00147             u32 newAlloc;
+00148             switch ( strategy )
+00149             {
+00150                 case ALLOC_STRATEGY_DOUBLE:
+00151                     newAlloc = used + 1 + (allocated < 500 ?
+00152                             (allocated < 5 ? 5 : used) : used >> 2);
+00153                     break;
+00154                 default:
+00155                 case ALLOC_STRATEGY_SAFE:
+00156                     newAlloc = used + 1;
+00157                     break;
+00158             }
+00159             reallocate( newAlloc);
+00160 
+00161             // move array content and construct new element
+00162             // first move end one up
+00163             for (u32 i=used; i>index; --i)
+00164             {
+00165                 if (i<used)
+00166                     allocator.destruct(&data[i]);
+00167                 allocator.construct(&data[i], data[i-1]); // data[i] = data[i-1];
+00168             }
+00169             // then add new element
+00170             if (used > index)
+00171                 allocator.destruct(&data[index]);
+00172             allocator.construct(&data[index], e); // data[index] = e;
+00173         }
+00174         else
+00175         {
+00176             // element inserted not at end
+00177             if ( used > index )
+00178             {
+00179                 // create one new element at the end
+00180                 allocator.construct(&data[used], data[used-1]);
+00181 
+00182                 // move the rest of the array content
+00183                 for (u32 i=used-1; i>index; --i)
+00184                 {
+00185                     data[i] = data[i-1];
+00186                 }
+00187                 // insert the new element
+00188                 data[index] = element;
+00189             }
+00190             else
+00191             {
+00192                 // insert the new element to the end
+00193                 allocator.construct(&data[index], element);
+00194             }
+00195         }
+00196         // set to false as we don't know if we have the comparison operators
+00197         is_sorted = false;
+00198         ++used;
+00199     }
+00200 
+00201 
+00203     void clear()
+00204     {
+00205         if (free_when_destroyed)
+00206         {
+00207             for (u32 i=0; i<used; ++i)
+00208                 allocator.destruct(&data[i]);
+00209 
+00210             allocator.deallocate(data); // delete [] data;
+00211         }
+00212         data = 0;
+00213         used = 0;
+00214         allocated = 0;
+00215         is_sorted = true;
+00216     }
+00217 
+00218 
+00220 
+00228     void set_pointer(T* newPointer, u32 size, bool _is_sorted=false, bool _free_when_destroyed=true)
+00229     {
+00230         clear();
+00231         data = newPointer;
+00232         allocated = size;
+00233         used = size;
+00234         is_sorted = _is_sorted;
+00235         free_when_destroyed=_free_when_destroyed;
+00236     }
+00237 
+00238 
+00240 
+00247     void set_free_when_destroyed(bool f)
+00248     {
+00249         free_when_destroyed = f;
+00250     }
+00251 
+00252 
+00254 
+00257     void set_used(u32 usedNow)
+00258     {
+00259         if (allocated < usedNow)
+00260             reallocate(usedNow);
+00261 
+00262         used = usedNow;
+00263     }
+00264 
+00265 
+00267     const array<T, TAlloc>& operator=(const array<T, TAlloc>& other)
+00268     {
+00269         if (this == &other)
+00270             return *this;
+00271         strategy = other.strategy;
+00272 
+00273         if (data)
+00274             clear();
+00275 
+00276         //if (allocated < other.allocated)
+00277         if (other.allocated == 0)
+00278             data = 0;
+00279         else
+00280             data = allocator.allocate(other.allocated); // new T[other.allocated];
+00281 
+00282         used = other.used;
+00283         free_when_destroyed = true;
+00284         is_sorted = other.is_sorted;
+00285         allocated = other.allocated;
+00286 
+00287         for (u32 i=0; i<other.used; ++i)
+00288             allocator.construct(&data[i], other.data[i]); // data[i] = other.data[i];
+00289 
+00290         return *this;
+00291     }
+00292 
+00293 
+00295     bool operator == (const array<T, TAlloc>& other) const
+00296     {
+00297         if (used != other.used)
+00298             return false;
+00299 
+00300         for (u32 i=0; i<other.used; ++i)
+00301             if (data[i] != other[i])
+00302                 return false;
+00303         return true;
+00304     }
+00305 
+00306 
+00308     bool operator != (const array<T, TAlloc>& other) const
+00309     {
+00310         return !(*this==other);
+00311     }
+00312 
+00313 
+00315     T& operator [](u32 index)
+00316     {
+00317         _IRR_DEBUG_BREAK_IF(index>=used) // access violation
+00318 
+00319         return data[index];
+00320     }
+00321 
+00322 
+00324     const T& operator [](u32 index) const
+00325     {
+00326         _IRR_DEBUG_BREAK_IF(index>=used) // access violation
+00327 
+00328         return data[index];
+00329     }
+00330 
+00331 
+00333     T& getLast()
+00334     {
+00335         _IRR_DEBUG_BREAK_IF(!used) // access violation
+00336 
+00337         return data[used-1];
+00338     }
+00339 
+00340 
+00342     const T& getLast() const
+00343     {
+00344         _IRR_DEBUG_BREAK_IF(!used) // access violation
+00345 
+00346         return data[used-1];
+00347     }
+00348 
+00349 
+00351 
+00352     T* pointer()
+00353     {
+00354         return data;
+00355     }
+00356 
+00357 
+00359 
+00360     const T* const_pointer() const
+00361     {
+00362         return data;
+00363     }
+00364 
+00365 
+00367 
+00368     u32 size() const
+00369     {
+00370         return used;
+00371     }
+00372 
+00373 
+00375 
+00377     u32 allocated_size() const
+00378     {
+00379         return allocated;
+00380     }
+00381 
+00382 
+00384 
+00385     bool empty() const
+00386     {
+00387         return used == 0;
+00388     }
+00389 
+00390 
+00392 
+00394     void sort()
+00395     {
+00396         if (!is_sorted && used>1)
+00397             heapsort(data, used);
+00398         is_sorted = true;
+00399     }
+00400 
+00401 
+00403 
+00409     s32 binary_search(const T& element)
+00410     {
+00411         sort();
+00412         return binary_search(element, 0, used-1);
+00413     }
+00414 
+00415 
+00417 
+00422     s32 binary_search(const T& element) const
+00423     {
+00424         if (is_sorted)
+00425             return binary_search(element, 0, used-1);
+00426         else
+00427             return linear_search(element);
+00428     }
+00429 
+00430 
+00432 
+00437     s32 binary_search(const T& element, s32 left, s32 right) const
+00438     {
+00439         if (!used)
+00440             return -1;
+00441 
+00442         s32 m;
+00443 
+00444         do
+00445         {
+00446             m = (left+right)>>1;
+00447 
+00448             if (element < data[m])
+00449                 right = m - 1;
+00450             else
+00451                 left = m + 1;
+00452 
+00453         } while((element < data[m] || data[m] < element) && left<=right);
+00454         // this last line equals to:
+00455         // " while((element != array[m]) && left<=right);"
+00456         // but we only want to use the '<' operator.
+00457         // the same in next line, it is "(element == array[m])"
+00458 
+00459 
+00460         if (!(element < data[m]) && !(data[m] < element))
+00461             return m;
+00462 
+00463         return -1;
+00464     }
+00465 
+00466 
+00469 
+00475     s32 binary_search_multi(const T& element, s32 &last)
+00476     {
+00477         sort();
+00478         s32 index = binary_search(element, 0, used-1);
+00479         if ( index < 0 )
+00480             return index;
+00481 
+00482         // The search can be somewhere in the middle of the set
+00483         // look linear previous and past the index
+00484         last = index;
+00485 
+00486         while ( index > 0 && !(element < data[index - 1]) && !(data[index - 1] < element) )
+00487         {
+00488             index -= 1;
+00489         }
+00490         // look linear up
+00491         while ( last < (s32) used - 1 && !(element < data[last + 1]) && !(data[last + 1] < element) )
+00492         {
+00493             last += 1;
+00494         }
+00495 
+00496         return index;
+00497     }
+00498 
+00499 
+00501 
+00506     s32 linear_search(const T& element) const
+00507     {
+00508         for (u32 i=0; i<used; ++i)
+00509             if (element == data[i])
+00510                 return (s32)i;
+00511 
+00512         return -1;
+00513     }
+00514 
+00515 
+00517 
+00522     s32 linear_reverse_search(const T& element) const
+00523     {
+00524         for (s32 i=used-1; i>=0; --i)
+00525             if (data[i] == element)
+00526                 return i;
+00527 
+00528         return -1;
+00529     }
+00530 
+00531 
+00533 
+00536     void erase(u32 index)
+00537     {
+00538         _IRR_DEBUG_BREAK_IF(index>=used) // access violation
+00539 
+00540         for (u32 i=index+1; i<used; ++i)
+00541         {
+00542             allocator.destruct(&data[i-1]);
+00543             allocator.construct(&data[i-1], data[i]); // data[i-1] = data[i];
+00544         }
+00545 
+00546         allocator.destruct(&data[used-1]);
+00547 
+00548         --used;
+00549     }
+00550 
+00551 
+00553 
+00557     void erase(u32 index, s32 count)
+00558     {
+00559         if (index>=used || count<1)
+00560             return;
+00561         if (index+count>used)
+00562             count = used-index;
+00563 
+00564         u32 i;
+00565         for (i=index; i<index+count; ++i)
+00566             allocator.destruct(&data[i]);
+00567 
+00568         for (i=index+count; i<used; ++i)
+00569         {
+00570             if (i-count >= index+count) // not already destructed before loop
+00571                 allocator.destruct(&data[i-count]);
+00572 
+00573             allocator.construct(&data[i-count], data[i]); // data[i-count] = data[i];
+00574 
+00575             if (i >= used-count)    // those which are not overwritten
+00576                 allocator.destruct(&data[i]);
+00577         }
+00578 
+00579         used-= count;
+00580     }
+00581 
+00582 
+00584     void set_sorted(bool _is_sorted)
+00585     {
+00586         is_sorted = _is_sorted;
+00587     }
+00588 
+00589 
+00591 
+00594     void swap(array<T, TAlloc>& other)
+00595     {
+00596         core::swap(data, other.data);
+00597         core::swap(allocated, other.allocated);
+00598         core::swap(used, other.used);
+00599         core::swap(allocator, other.allocator); // memory is still released by the same allocator used for allocation
+00600         eAllocStrategy helper_strategy(strategy);   // can't use core::swap with bitfields
+00601         strategy = other.strategy;
+00602         other.strategy = helper_strategy;
+00603         bool helper_free_when_destroyed(free_when_destroyed);
+00604         free_when_destroyed = other.free_when_destroyed;
+00605         other.free_when_destroyed = helper_free_when_destroyed;
+00606         bool helper_is_sorted(is_sorted);
+00607         is_sorted = other.is_sorted;
+00608         other.is_sorted = helper_is_sorted;
+00609     }
+00610 
+00611 
+00612 private:
+00613     T* data;
+00614     u32 allocated;
+00615     u32 used;
+00616     TAlloc allocator;
+00617     eAllocStrategy strategy:4;
+00618     bool free_when_destroyed:1;
+00619     bool is_sorted:1;
+00620 };
+00621 
+00622 
+00623 } // end namespace core
+00624 } // end namespace irr
+00625 
+00626 #endif
+00627 
+
+
+ + + + + -- cgit v1.1