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 deletions(-) delete mode 100644 libraries/irrlicht-1.8.1/doc/html/irr_array_8h_source.html (limited to 'libraries/irrlicht-1.8.1/doc/html/irr_array_8h_source.html') diff --git a/libraries/irrlicht-1.8.1/doc/html/irr_array_8h_source.html b/libraries/irrlicht-1.8.1/doc/html/irr_array_8h_source.html deleted file mode 100644 index b6e4ed9..0000000 --- a/libraries/irrlicht-1.8.1/doc/html/irr_array_8h_source.html +++ /dev/null @@ -1,643 +0,0 @@ - - -
- -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 -