 |
Changeset 5064
- Timestamp:
- 11/08/09 20:13:46
(3 years ago)
- Author:
- kris
- Message:
fixes #1303 :: x86_64 corrections for util.container
Kudos to Cyborg16
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r4397 |
r5064 |
|
| 29 | 29 | --- |
|---|
| 30 | 30 | Iterator iterator () |
|---|
| 31 | | uint opApply (int delegate(ref V value) dg) |
|---|
| | 31 | int opApply (int delegate(ref V value) dg) |
|---|
| 32 | 32 | |
|---|
| 33 | 33 | CircularList add (V element) |
|---|
| 34 | | CircularList addAt (uint index, V element) |
|---|
| | 34 | CircularList addAt (size_t index, V element) |
|---|
| 35 | 35 | CircularList append (V element) |
|---|
| 36 | 36 | CircularList prepend (V element) |
|---|
| 37 | | uint addAt (uint index, IContainer!(V) e) |
|---|
| 38 | | uint append (IContainer!(V) e) |
|---|
| 39 | | uint prepend (IContainer!(V) e) |
|---|
| | 37 | size_t addAt (size_t index, IContainer!(V) e) |
|---|
| | 38 | size_t append (IContainer!(V) e) |
|---|
| | 39 | size_t prepend (IContainer!(V) e) |
|---|
| 40 | 40 | |
|---|
| 41 | 41 | bool take (ref V v) |
|---|
| 42 | 42 | bool contains (V element) |
|---|
| 43 | | V get (uint index) |
|---|
| 44 | | uint first (V element, uint startingIndex = 0) |
|---|
| 45 | | uint last (V element, uint startingIndex = 0) |
|---|
| | 43 | V get (size_t index) |
|---|
| | 44 | size_t first (V element, size_t startingIndex = 0) |
|---|
| | 45 | size_t last (V element, size_t startingIndex = 0) |
|---|
| 46 | 46 | |
|---|
| 47 | 47 | V head () |
|---|
| … | … | |
| 52 | 52 | V removeTail () |
|---|
| 53 | 53 | |
|---|
| 54 | | bool removeAt (uint index) |
|---|
| 55 | | uint remove (V element, bool all) |
|---|
| 56 | | uint removeRange (uint fromIndex, uint toIndex) |
|---|
| 57 | | |
|---|
| 58 | | uint replace (V oldElement, V newElement, bool all) |
|---|
| 59 | | bool replaceAt (uint index, V element) |
|---|
| 60 | | |
|---|
| 61 | | uint size () |
|---|
| | 54 | bool removeAt (size_t index) |
|---|
| | 55 | size_t remove (V element, bool all) |
|---|
| | 56 | size_t removeRange (size_t fromIndex, size_t toIndex) |
|---|
| | 57 | |
|---|
| | 58 | size_t replace (V oldElement, V newElement, bool all) |
|---|
| | 59 | bool replaceAt (size_t index, V element) |
|---|
| | 60 | |
|---|
| | 61 | size_t size () |
|---|
| 62 | 62 | bool isEmpty () |
|---|
| 63 | 63 | V[] toArray (V[] dst) |
|---|
| 64 | 64 | CircularList dup () |
|---|
| 65 | | CircularList subset (uint from, uint length) |
|---|
| | 65 | CircularList subset (size_t from, size_t length) |
|---|
| 66 | 66 | CircularList clear () |
|---|
| 67 | 67 | CircularList reset () |
|---|
| … | … | |
| 83 | 83 | |
|---|
| 84 | 84 | // number of elements contained |
|---|
| 85 | | private uint count; |
|---|
| | 85 | private size_t count; |
|---|
| 86 | 86 | |
|---|
| 87 | 87 | // configured heap manager |
|---|
| … | … | |
| 89 | 89 | |
|---|
| 90 | 90 | // mutation tag updates on each change |
|---|
| 91 | | private uint mutation; |
|---|
| | 91 | private size_t mutation; |
|---|
| 92 | 92 | |
|---|
| 93 | 93 | // head of the list. Null if empty |
|---|
| … | … | |
| 112 | 112 | ***********************************************************************/ |
|---|
| 113 | 113 | |
|---|
| 114 | | protected this (Ref h, uint c) |
|---|
| | 114 | protected this (Ref h, size_t c) |
|---|
| 115 | 115 | { |
|---|
| 116 | 116 | list = h; |
|---|
| … | … | |
| 175 | 175 | ***********************************************************************/ |
|---|
| 176 | 176 | |
|---|
| 177 | | final uint size () |
|---|
| | 177 | final size_t size () |
|---|
| 178 | 178 | { |
|---|
| 179 | 179 | return count; |
|---|
| … | … | |
| 233 | 233 | ***********************************************************************/ |
|---|
| 234 | 234 | |
|---|
| 235 | | final V get (uint index) |
|---|
| | 235 | final V get (size_t index) |
|---|
| 236 | 236 | { |
|---|
| 237 | 237 | return cellAt(index).value; |
|---|
| … | … | |
| 241 | 241 | |
|---|
| 242 | 242 | Time complexity: O(n) |
|---|
| 243 | | |
|---|
| 244 | | ***********************************************************************/ |
|---|
| 245 | | |
|---|
| 246 | | final uint first (V element, uint startingIndex = 0) |
|---|
| | 243 | Returns size_t.max if no element found. |
|---|
| | 244 | |
|---|
| | 245 | ***********************************************************************/ |
|---|
| | 246 | |
|---|
| | 247 | final size_t first (V element, size_t startingIndex = 0) |
|---|
| 247 | 248 | { |
|---|
| 248 | 249 | if (startingIndex < 0) |
|---|
| … | … | |
| 251 | 252 | auto p = list; |
|---|
| 252 | 253 | if (p is null) |
|---|
| 253 | | return uint.max; |
|---|
| 254 | | |
|---|
| 255 | | for (uint i = 0; true; ++i) |
|---|
| | 254 | return size_t.max; |
|---|
| | 255 | |
|---|
| | 256 | for (size_t i = 0; true; ++i) |
|---|
| 256 | 257 | { |
|---|
| 257 | 258 | if (i >= startingIndex && element == p.value) |
|---|
| … | … | |
| 262 | 263 | break; |
|---|
| 263 | 264 | } |
|---|
| 264 | | return uint.max; |
|---|
| 265 | | } |
|---|
| 266 | | |
|---|
| 267 | | /*********************************************************************** |
|---|
| 268 | | |
|---|
| 269 | | Time complexity: O(n) |
|---|
| 270 | | |
|---|
| 271 | | ***********************************************************************/ |
|---|
| 272 | | |
|---|
| 273 | | final uint last (V element, uint startingIndex = 0) |
|---|
| | 265 | return size_t.max; |
|---|
| | 266 | } |
|---|
| | 267 | |
|---|
| | 268 | /*********************************************************************** |
|---|
| | 269 | |
|---|
| | 270 | Time complexity: O(n) |
|---|
| | 271 | Returns size_t.max if no element found. |
|---|
| | 272 | |
|---|
| | 273 | ***********************************************************************/ |
|---|
| | 274 | |
|---|
| | 275 | final size_t last (V element, size_t startingIndex = 0) |
|---|
| 274 | 276 | { |
|---|
| 275 | 277 | if (count is 0) |
|---|
| 276 | | return uint.max; |
|---|
| | 278 | return size_t.max; |
|---|
| 277 | 279 | |
|---|
| 278 | 280 | if (startingIndex >= count) |
|---|
| … | … | |
| 283 | 285 | |
|---|
| 284 | 286 | auto p = cellAt (startingIndex); |
|---|
| 285 | | uint i = startingIndex; |
|---|
| | 287 | size_t i = startingIndex; |
|---|
| 286 | 288 | for (;;) |
|---|
| 287 | 289 | { |
|---|
| … | … | |
| 297 | 299 | } |
|---|
| 298 | 300 | } |
|---|
| 299 | | return uint.max; |
|---|
| | 301 | return size_t.max; |
|---|
| 300 | 302 | } |
|---|
| 301 | 303 | |
|---|
| … | … | |
| 306 | 308 | ***********************************************************************/ |
|---|
| 307 | 309 | |
|---|
| 308 | | final CircularList subset (uint from, uint length) |
|---|
| | 310 | final CircularList subset (size_t from, size_t length) |
|---|
| 309 | 311 | { |
|---|
| 310 | 312 | Ref newlist = null; |
|---|
| … | … | |
| 316 | 318 | auto current = newlist = heap.allocate.set (p.value); |
|---|
| 317 | 319 | |
|---|
| 318 | | for (uint i = 1; i < length; ++i) |
|---|
| | 320 | for (size_t i = 1; i < length; ++i) |
|---|
| 319 | 321 | { |
|---|
| 320 | 322 | p = p.next; |
|---|
| … | … | |
| 499 | 501 | ***********************************************************************/ |
|---|
| 500 | 502 | |
|---|
| 501 | | final CircularList addAt (uint index, V element) |
|---|
| | 503 | final CircularList addAt (size_t index, V element) |
|---|
| 502 | 504 | { |
|---|
| 503 | 505 | if (index is 0) |
|---|
| … | … | |
| 517 | 519 | ***********************************************************************/ |
|---|
| 518 | 520 | |
|---|
| 519 | | final CircularList replaceAt (uint index, V element) |
|---|
| | 521 | final CircularList replaceAt (size_t index, V element) |
|---|
| 520 | 522 | { |
|---|
| 521 | 523 | cellAt(index).value = element; |
|---|
| … | … | |
| 530 | 532 | ***********************************************************************/ |
|---|
| 531 | 533 | |
|---|
| 532 | | final CircularList removeAt (uint index) |
|---|
| | 534 | final CircularList removeAt (size_t index) |
|---|
| 533 | 535 | { |
|---|
| 534 | 536 | if (index is 0) |
|---|
| … | … | |
| 549 | 551 | ***********************************************************************/ |
|---|
| 550 | 552 | |
|---|
| 551 | | final uint remove (V element, bool all) |
|---|
| | 553 | final size_t remove (V element, bool all) |
|---|
| 552 | 554 | { |
|---|
| 553 | 555 | auto c = count; |
|---|
| … | … | |
| 594 | 596 | ***********************************************************************/ |
|---|
| 595 | 597 | |
|---|
| 596 | | final uint replace (V oldElement, V newElement, bool all) |
|---|
| 597 | | { |
|---|
| 598 | | uint c; |
|---|
| | 598 | final size_t replace (V oldElement, V newElement, bool all) |
|---|
| | 599 | { |
|---|
| | 600 | size_t c; |
|---|
| 599 | 601 | if (list) |
|---|
| 600 | 602 | { |
|---|
| … | … | |
| 621 | 623 | ***********************************************************************/ |
|---|
| 622 | 624 | |
|---|
| 623 | | final uint prepend (IContainer!(V) e) |
|---|
| | 625 | final size_t prepend (IContainer!(V) e) |
|---|
| 624 | 626 | { |
|---|
| 625 | 627 | Ref hd = null; |
|---|
| … | … | |
| 664 | 666 | ***********************************************************************/ |
|---|
| 665 | 667 | |
|---|
| 666 | | final uint append (IContainer!(V) e) |
|---|
| | 668 | final size_t append (IContainer!(V) e) |
|---|
| 667 | 669 | { |
|---|
| 668 | 670 | auto c = count; |
|---|
| … | … | |
| 688 | 690 | ***********************************************************************/ |
|---|
| 689 | 691 | |
|---|
| 690 | | final uint addAt (uint index, IContainer!(V) e) |
|---|
| | 692 | final size_t addAt (size_t index, IContainer!(V) e) |
|---|
| 691 | 693 | { |
|---|
| 692 | 694 | auto c = count; |
|---|
| … | … | |
| 712 | 714 | ***********************************************************************/ |
|---|
| 713 | 715 | |
|---|
| 714 | | final uint removeRange (uint fromIndex, uint toIndex) |
|---|
| | 716 | final size_t removeRange (size_t fromIndex, size_t toIndex) |
|---|
| 715 | 717 | { |
|---|
| 716 | 718 | auto p = cellAt (fromIndex); |
|---|
| 717 | 719 | auto last = list.prev; |
|---|
| 718 | 720 | auto c = count; |
|---|
| 719 | | for (uint i = fromIndex; i <= toIndex; ++i) |
|---|
| | 721 | for (size_t i = fromIndex; i <= toIndex; ++i) |
|---|
| 720 | 722 | { |
|---|
| 721 | 723 | auto n = p.next; |
|---|
| … | … | |
| 754 | 756 | dst.length = count; |
|---|
| 755 | 757 | |
|---|
| 756 | | int i = 0; |
|---|
| | 758 | size_t i = 0; |
|---|
| 757 | 759 | foreach (v; this) |
|---|
| 758 | 760 | dst[i++] = v; |
|---|
| … | … | |
| 785 | 787 | if (list) |
|---|
| 786 | 788 | { |
|---|
| 787 | | uint c = 0; |
|---|
| | 789 | size_t c = 0; |
|---|
| 788 | 790 | auto p = list; |
|---|
| 789 | 791 | do { |
|---|
| … | … | |
| 806 | 808 | ***********************************************************************/ |
|---|
| 807 | 809 | |
|---|
| 808 | | private uint instances (V element) |
|---|
| | 810 | private size_t instances (V element) |
|---|
| 809 | 811 | { |
|---|
| 810 | 812 | if (list) |
|---|
| … | … | |
| 818 | 820 | ***********************************************************************/ |
|---|
| 819 | 821 | |
|---|
| 820 | | private void checkIndex (uint i) |
|---|
| | 822 | private void checkIndex (size_t i) |
|---|
| 821 | 823 | { |
|---|
| 822 | 824 | if (i >= count) |
|---|
| … | … | |
| 854 | 856 | ***********************************************************************/ |
|---|
| 855 | 857 | |
|---|
| 856 | | private Ref cellAt (uint index) |
|---|
| | 858 | private Ref cellAt (size_t index) |
|---|
| 857 | 859 | { |
|---|
| 858 | 860 | checkIndex (index); |
|---|
| … | … | |
| 936 | 938 | prior; |
|---|
| 937 | 939 | CircularList owner; |
|---|
| 938 | | uint mutation; |
|---|
| | 940 | size_t mutation; |
|---|
| 939 | 941 | |
|---|
| 940 | 942 | /*************************************************************** |
|---|
| r4312 |
r5064 |
|
| 35 | 35 | ***********************************************************************/ |
|---|
| 36 | 36 | |
|---|
| 37 | | static int defaultInitialBuckets = 31; |
|---|
| | 37 | static size_t defaultInitialBuckets = 31; |
|---|
| 38 | 38 | |
|---|
| 39 | 39 | /*********************************************************************** |
|---|
| … | … | |
| 70 | 70 | ***********************************************************************/ |
|---|
| 71 | 71 | |
|---|
| 72 | | static uint hash(K) (K k, uint length) |
|---|
| | 72 | static size_t hash(K) (K k, size_t length) |
|---|
| 73 | 73 | { |
|---|
| 74 | 74 | static if (is(K : int) || is(K : uint) || |
|---|
| … | … | |
| 77 | 77 | is(K : byte) || is(K : ubyte) || |
|---|
| 78 | 78 | is(K : char) || is(K : wchar) || is (K : dchar)) |
|---|
| 79 | | return cast(uint) (k % length); |
|---|
| | 79 | return cast(size_t) (k % length); |
|---|
| 80 | 80 | else |
|---|
| 81 | 81 | return (typeid(K).getHash(&k) & 0x7FFFFFFF) % length; |
|---|
| … | … | |
| 107 | 107 | ***************************************************************/ |
|---|
| 108 | 108 | |
|---|
| 109 | | T*[] allocate (uint count) |
|---|
| | 109 | T*[] allocate (size_t count) |
|---|
| 110 | 110 | { |
|---|
| 111 | 111 | return new T*[count]; |
|---|
| … | … | |
| 194 | 194 | ***************************************************************/ |
|---|
| 195 | 195 | |
|---|
| 196 | | T*[] allocate (uint count) |
|---|
| | 196 | T*[] allocate (size_t count) |
|---|
| 197 | 197 | { |
|---|
| 198 | 198 | return (cast(T**) calloc(count, (T*).sizeof)) [0 .. count]; |
|---|
| … | … | |
| 273 | 273 | private T[] list; |
|---|
| 274 | 274 | private T[][] lists; |
|---|
| 275 | | private int index; |
|---|
| 276 | | private int freelists; |
|---|
| 277 | | private int presize = 0; |
|---|
| 278 | | private int chunks = 1000; |
|---|
| | 275 | private size_t index; |
|---|
| | 276 | private size_t freelists; |
|---|
| | 277 | private size_t presize = 0; |
|---|
| | 278 | private size_t chunks = 1000; |
|---|
| 279 | 279 | |
|---|
| 280 | 280 | private struct Discarded |
|---|
| … | … | |
| 290 | 290 | ***************************************************************/ |
|---|
| 291 | 291 | |
|---|
| 292 | | void config (int chunks, int presize) |
|---|
| | 292 | void config (size_t chunks, size_t presize) |
|---|
| 293 | 293 | { |
|---|
| 294 | 294 | this.chunks = chunks; |
|---|
| … | … | |
| 327 | 327 | ***************************************************************/ |
|---|
| 328 | 328 | |
|---|
| 329 | | T*[] allocate (uint count) |
|---|
| | 329 | T*[] allocate (size_t count) |
|---|
| 330 | 330 | { |
|---|
| 331 | 331 | return (cast(T**) calloc(count, (T*).sizeof)) [0 .. count]; |
|---|
| r4312 |
r5064 |
|
| 42 | 42 | bool take (ref V element) |
|---|
| 43 | 43 | bool take (K key, ref V element) |
|---|
| 44 | | uint remove (V element, bool all) |
|---|
| 45 | | uint remove (IContainer!(V) e, bool all) |
|---|
| 46 | | uint replace (V oldElement, V newElement, bool all) |
|---|
| | 44 | size_t remove (V element, bool all) |
|---|
| | 45 | size_t remove (IContainer!(V) e, bool all) |
|---|
| | 46 | size_t replace (V oldElement, V newElement, bool all) |
|---|
| 47 | 47 | bool replacePair (K key, V oldElement, V newElement) |
|---|
| 48 | 48 | |
|---|
| … | … | |
| 52 | 52 | V* opIn_r (K key) |
|---|
| 53 | 53 | |
|---|
| 54 | | uint size () |
|---|
| | 54 | size_t size () |
|---|
| 55 | 55 | bool isEmpty () |
|---|
| 56 | 56 | V[] toArray (V[] dst) |
|---|
| … | … | |
| 58 | 58 | HashMap clear () |
|---|
| 59 | 59 | HashMap reset () |
|---|
| 60 | | uint buckets () |
|---|
| | 60 | size_t buckets () |
|---|
| 61 | 61 | float threshold () |
|---|
| 62 | | void buckets (uint cap) |
|---|
| | 62 | void buckets (size_t cap) |
|---|
| 63 | 63 | void threshold (float desired) |
|---|
| 64 | 64 | Allocator allocator() |
|---|
| … | … | |
| 83 | 83 | |
|---|
| 84 | 84 | // number of elements contained |
|---|
| 85 | | private uint count; |
|---|
| | 85 | private size_t count; |
|---|
| 86 | 86 | |
|---|
| 87 | 87 | // the threshold load factor |
|---|
| … | … | |
| 92 | 92 | |
|---|
| 93 | 93 | // mutation tag updates on each change |
|---|
| 94 | | private uint mutation; |
|---|
| | 94 | private size_t mutation; |
|---|
| 95 | 95 | |
|---|
| 96 | 96 | /*********************************************************************** |
|---|
| … | … | |
| 170 | 170 | ***********************************************************************/ |
|---|
| 171 | 171 | |
|---|
| 172 | | final uint size () |
|---|
| | 172 | final size_t size () |
|---|
| 173 | 173 | { |
|---|
| 174 | 174 | return count; |
|---|
| … | … | |
| 577 | 577 | ************************************************************************/ |
|---|
| 578 | 578 | |
|---|
| 579 | | final uint remove (IContainer!(V) e, bool all = false) |
|---|
| 580 | | { |
|---|
| 581 | | int i = count; |
|---|
| | 579 | final size_t remove (IContainer!(V) e, bool all = false) |
|---|
| | 580 | { |
|---|
| | 581 | auto i = count; |
|---|
| 582 | 582 | foreach (value; e) |
|---|
| 583 | 583 | remove (value, all); |
|---|
| … | … | |
| 594 | 594 | ************************************************************************/ |
|---|
| 595 | 595 | |
|---|
| 596 | | final uint remove (V element, bool all = false) |
|---|
| | 596 | final size_t remove (V element, bool all = false) |
|---|
| 597 | 597 | { |
|---|
| 598 | 598 | auto i = count; |
|---|
| … | … | |
| 643 | 643 | ************************************************************************/ |
|---|
| 644 | 644 | |
|---|
| 645 | | final uint replace (V oldElement, V newElement, bool all = false) |
|---|
| 646 | | { |
|---|
| 647 | | uint i; |
|---|
| | 645 | final size_t replace (V oldElement, V newElement, bool all = false) |
|---|
| | 646 | { |
|---|
| | 647 | size_t i; |
|---|
| 648 | 648 | |
|---|
| 649 | 649 | if (count && oldElement != newElement) |
|---|
| … | … | |
| 700 | 700 | ***********************************************************************/ |
|---|
| 701 | 701 | |
|---|
| 702 | | final uint buckets () |
|---|
| | 702 | final size_t buckets () |
|---|
| 703 | 703 | { |
|---|
| 704 | 704 | return table ? table.length : 0; |
|---|
| … | … | |
| 716 | 716 | ***********************************************************************/ |
|---|
| 717 | 717 | |
|---|
| 718 | | final void buckets (uint cap) |
|---|
| | 718 | final void buckets (size_t cap) |
|---|
| 719 | 719 | { |
|---|
| 720 | 720 | if (cap < Container.defaultInitialBuckets) |
|---|
| … | … | |
| 734 | 734 | ***********************************************************************/ |
|---|
| 735 | 735 | |
|---|
| 736 | | final void buckets (uint cap, float threshold) |
|---|
| | 736 | final void buckets (size_t cap, float threshold) |
|---|
| 737 | 737 | { |
|---|
| 738 | 738 | loadFactor = threshold; |
|---|
| 739 | | buckets (cast(int)(cap / threshold) + 1); |
|---|
| | 739 | buckets (cast(size_t)(cap / threshold) + 1); |
|---|
| 740 | 740 | } |
|---|
| 741 | 741 | |
|---|
| … | … | |
| 792 | 792 | dst.length = count; |
|---|
| 793 | 793 | |
|---|
| 794 | | int i = 0; |
|---|
| | 794 | size_t i = 0; |
|---|
| 795 | 795 | foreach (k, v; this) |
|---|
| 796 | 796 | dst[i++] = v; |
|---|
| … | … | |
| 825 | 825 | if (table) |
|---|
| 826 | 826 | { |
|---|
| 827 | | int c = 0; |
|---|
| 828 | | for (int i=0; i < table.length; ++i) |
|---|
| | 827 | size_t c = 0; |
|---|
| | 828 | for (size_t i=0; i < table.length; ++i) |
|---|
| 829 | 829 | for (auto p = table[i]; p; p = p.next) |
|---|
| 830 | 830 | { |
|---|
| … | … | |
| 850 | 850 | ***********************************************************************/ |
|---|
| 851 | 851 | |
|---|
| 852 | | private uint instances (V element) |
|---|
| 853 | | { |
|---|
| 854 | | uint c = 0; |
|---|
| | 852 | private size_t instances (V element) |
|---|
| | 853 | { |
|---|
| | 854 | size_t c = 0; |
|---|
| 855 | 855 | foreach (node; table) |
|---|
| 856 | 856 | if (node) |
|---|
| … | … | |
| 871 | 871 | float ft = table.length; |
|---|
| 872 | 872 | if (fc / ft > loadFactor) |
|---|
| 873 | | resize (2 * cast(int)(fc / loadFactor) + 1); |
|---|
| | 873 | resize (2 * cast(size_t)(fc / loadFactor) + 1); |
|---|
| 874 | 874 | return this; |
|---|
| 875 | 875 | } |
|---|
| … | … | |
| 881 | 881 | ***********************************************************************/ |
|---|
| 882 | 882 | |
|---|
| 883 | | private void resize (uint newCap) |
|---|
| | 883 | private void resize (size_t newCap) |
|---|
| 884 | 884 | { |
|---|
| 885 | 885 | // Stdout.formatln ("resize {}", newCap); |
|---|
| … | … | |
| 1006 | 1006 | private struct Iterator |
|---|
| 1007 | 1007 | { |
|---|
| 1008 | | uint row; |
|---|
| | 1008 | size_t row; |
|---|
| 1009 | 1009 | Ref cell, |
|---|
| 1010 | 1010 | prior; |
|---|
| 1011 | 1011 | Ref[] table; |
|---|
| 1012 | 1012 | HashMap owner; |
|---|
| 1013 | | uint mutation; |
|---|
| | 1013 | size_t mutation; |
|---|
| 1014 | 1014 | |
|---|
| 1015 | 1015 | /*************************************************************** |
|---|
| r4312 |
r5064 |
|
| 35 | 35 | bool take (ref V element) |
|---|
| 36 | 36 | bool remove (V element) |
|---|
| 37 | | uint remove (IContainer!(V) e) |
|---|
| | 37 | size_t remove (IContainer!(V) e) |
|---|
| 38 | 38 | bool replace (V oldElement, V newElement) |
|---|
| 39 | 39 | |
|---|
| 40 | | uint size () |
|---|
| | 40 | size_t size () |
|---|
| 41 | 41 | bool isEmpty () |
|---|
| 42 | 42 | V[] toArray (V[] dst) |
|---|
| … | … | |
| 45 | 45 | HashSet reset () |
|---|
| 46 | 46 | |
|---|
| 47 | | uint buckets () |
|---|
| 48 | | void buckets (uint cap) |
|---|
| | 47 | size_t buckets () |
|---|
| | 48 | void buckets (size_t cap) |
|---|
| 49 | 49 | float threshold () |
|---|
| 50 | 50 | void threshold (float desired) |
|---|
| … | … | |
| 69 | 69 | |
|---|
| 70 | 70 | // number of elements contained |
|---|
| 71 | | private uint count; |
|---|
| | 71 | private size_t count; |
|---|
| 72 | 72 | |
|---|
| 73 | 73 | // the threshold load factor |
|---|
| … | … | |
| 78 | 78 | |
|---|
| 79 | 79 | // mutation tag updates on each change |
|---|
| 80 | | private uint mutation; |
|---|
| | 80 | private size_t mutation; |
|---|
| 81 | 81 | |
|---|
| 82 | 82 | /*********************************************************************** |
|---|
| … | … | |
| 146 | 146 | ***********************************************************************/ |
|---|
| 147 | 147 | |
|---|
| 148 | | final uint size () |
|---|
| | 148 | final size_t size () |
|---|
| 149 | 149 | { |
|---|
| 150 | 150 | return count; |
|---|
| … | … | |
| 232 | 232 | ***********************************************************************/ |
|---|
| 233 | 233 | |
|---|
| 234 | | final uint remove (V element, bool all) |
|---|
| | 234 | final size_t remove (V element, bool all) |
|---|
| 235 | 235 | { |
|---|
| 236 | 236 | return remove(element) ? 1 : 0; |
|---|
| … | … | |
| 288 | 288 | ***********************************************************************/ |
|---|
| 289 | 289 | |
|---|
| 290 | | final uint replace (V oldElement, V newElement, bool all) |
|---|
| | 290 | final size_t replace (V oldElement, V newElement, bool all) |
|---|
| 291 | 291 | { |
|---|
| 292 | 292 | return replace (oldElement, newElement) ? 1 : 0; |
|---|
| … | … | |
| 352 | 352 | ************************************************************************/ |
|---|
| 353 | 353 | |
|---|
| 354 | | public uint remove (IContainer!(V) e) |
|---|
| 355 | | { |
|---|
| 356 | | uint c; |
|---|
| | 354 | public size_t remove (IContainer!(V) e) |
|---|
| | 355 | { |
|---|
| | 356 | size_t c; |
|---|
| 357 | 357 | foreach (value; e) |
|---|
| 358 | 358 | if (remove (value)) |
|---|
| … | … | |
| 401 | 401 | ***********************************************************************/ |
|---|
| 402 | 402 | |
|---|
| 403 | | final uint buckets () |
|---|
| | 403 | final size_t buckets () |
|---|
| 404 | 404 | { |
|---|
| 405 | 405 | return table ? table.length : 0; |
|---|
| … | … | |
| 414 | 414 | ***********************************************************************/ |
|---|
| 415 | 415 | |
|---|
| 416 | | final void buckets (uint cap) |
|---|
| | 416 | final void buckets (size_t cap) |
|---|
| 417 | 417 | { |
|---|
| 418 | 418 | if (cap < Container.defaultInitialBuckets) |
|---|
| … | … | |
| 469 | 469 | dst.length = count; |
|---|
| 470 | 470 | |
|---|
| 471 | | int i = 0; |
|---|
| | 471 | size_t i = 0; |
|---|
| 472 | 472 | foreach (v; this) |
|---|
| 473 | 473 | dst[i++] = v; |
|---|
| … | … | |
| 502 | 502 | if (table) |
|---|
| 503 | 503 | { |
|---|
| 504 | | int c = 0; |
|---|
| 505 | | for (int i = 0; i < table.length; ++i) |
|---|
| | 504 | size_t c = 0; |
|---|
| | 505 | for (size_t i = 0; i < table.length; ++i) |
|---|
| 506 | 506 | { |
|---|
| 507 | 507 | for (auto p = table[i]; p; p = p.next) |
|---|
| … | … | |
| 540 | 540 | float ft = table.length; |
|---|
| 541 | 541 | if (fc / ft > loadFactor) |
|---|
| 542 | | resize (2 * cast(int)(fc / loadFactor) + 1); |
|---|
| | 542 | resize (2 * cast(size_t)(fc / loadFactor) + 1); |
|---|
| 543 | 543 | } |
|---|
| 544 | 544 | |
|---|
| … | … | |
| 549 | 549 | ***********************************************************************/ |
|---|
| 550 | 550 | |
|---|
| 551 | | private void resize (uint newCap) |
|---|
| | 551 | private void resize (size_t newCap) |
|---|
| 552 | 552 | { |
|---|
| 553 | 553 | //Stdout.formatln ("resize {}", newCap); |
|---|
| … | … | |
| 580 | 580 | ***********************************************************************/ |
|---|
| 581 | 581 | |
|---|
| 582 | | private bool remove (Ref node, uint row) |
|---|
| | 582 | private bool remove (Ref node, size_t row) |
|---|
| 583 | 583 | { |
|---|
| 584 | 584 | auto hd = table[row]; |
|---|
| … | … | |
| 684 | 684 | private struct Iterator |
|---|
| 685 | 685 | { |
|---|
| 686 | | uint row; |
|---|
| | 686 | size_t row; |
|---|
| 687 | 687 | Ref cell, |
|---|
| 688 | 688 | prior; |
|---|
| 689 | 689 | Ref[] table; |
|---|
| 690 | 690 | HashSet owner; |
|---|
| 691 | | uint mutation; |
|---|
| | 691 | size_t mutation; |
|---|
| 692 | 692 | |
|---|
| 693 | 693 | /*************************************************************** |
|---|
| r4312 |
r5064 |
|
| 39 | 39 | |
|---|
| 40 | 40 | bool contains (V value) |
|---|
| 41 | | uint first (V value, uint startingIndex = 0) |
|---|
| 42 | | uint last (V value, uint startingIndex = 0) |
|---|
| | 41 | size_t first (V value, size_t startingIndex = 0) |
|---|
| | 42 | size_t last (V value, size_t startingIndex = 0) |
|---|
| 43 | 43 | |
|---|
| 44 | 44 | LinkedList add (V value) |
|---|
| 45 | 45 | LinkedList prepend (V value) |
|---|
| 46 | | uint prepend (IContainer!(V) e) |
|---|
| | 46 | size_t prepend (IContainer!(V) e) |
|---|
| 47 | 47 | LinkedList append (V value) |
|---|
| 48 | | uint append (IContainer!(V) e) |
|---|
| 49 | | LinkedList addAt (uint index, V value) |
|---|
| 50 | | uint addAt (uint index, IContainer!(V) e) |
|---|
| 51 | | |
|---|
| 52 | | V get (uint index) |
|---|
| | 48 | size_t append (IContainer!(V) e) |
|---|
| | 49 | LinkedList addAt (size_t index, V value) |
|---|
| | 50 | size_t addAt (size_t index, IContainer!(V) e) |
|---|
| | 51 | |
|---|
| | 52 | V get (size_t index) |
|---|
| 53 | 53 | bool take (ref V v) |
|---|
| 54 | | uint remove (V value, bool all) |
|---|
| 55 | | bool removeAt (uint index) |
|---|
| 56 | | uint removeRange (uint fromIndex, uint toIndex) |
|---|
| 57 | | uint replace (V oldElement, V newElement, bool all) |
|---|
| 58 | | bool replaceAt (uint index, V value) |
|---|
| | 54 | size_t remove (V value, bool all) |
|---|
| | 55 | bool removeAt (size_t index) |
|---|
| | 56 | size_t removeRange (size_t fromIndex, size_t toIndex) |
|---|
| | 57 | size_t replace (V oldElement, V newElement, bool all) |
|---|
| | 58 | bool replaceAt (size_t index, V value) |
|---|
| 59 | 59 | |
|---|
| 60 | 60 | LinkedList clear () |
|---|
| 61 | 61 | LinkedList reset () |
|---|
| 62 | 62 | |
|---|
| 63 | | LinkedList subset (uint from, uint length = int.max) |
|---|
| | 63 | LinkedList subset (size_t from, size_t length = size_t.max) |
|---|
| 64 | 64 | LinkedList dup () |
|---|
| 65 | 65 | |
|---|
| 66 | | uint size () |
|---|
| | 66 | size_t size () |
|---|
| 67 | 67 | bool isEmpty () |
|---|
| 68 | 68 | V[] toArray (V[] dst) |
|---|
| … | … | |
| 86 | 86 | |
|---|
| 87 | 87 | // number of elements contained |
|---|
| 88 | | private uint count; |
|---|
| | 88 | private size_t count; |
|---|
| 89 | 89 | |
|---|
| 90 | 90 | // configured heap manager |
|---|
| … | … | |
| 92 | 92 | |
|---|
| 93 | 93 | // mutation tag updates on each change |
|---|
| 94 | | private uint mutation; |
|---|
| | 94 | private size_t mutation; |
|---|
| 95 | 95 | |
|---|
| 96 | 96 | // head of the list. Null if empty |
|---|
| … | … | |
| 114 | 114 | ***********************************************************************/ |
|---|
| 115 | 115 | |
|---|
| 116 | | protected this (Ref l, int c) |
|---|
| | 116 | protected this (Ref l, size_t c) |
|---|
| 117 | 117 | { |
|---|
| 118 | 118 | list = l; |
|---|
| … | … | |
| 174 | 174 | ***********************************************************************/ |
|---|
| 175 | 175 | |
|---|
| 176 | | final uint size () |
|---|
| | 176 | final size_t size () |
|---|
| 177 | 177 | { |
|---|
| 178 | 178 | return count; |
|---|
| … | … | |
| 233 | 233 | ***********************************************************************/ |
|---|
| 234 | 234 | |
|---|
| 235 | | final V get (uint index) |
|---|
| | 235 | final V get (size_t index) |
|---|
| 236 | 236 | { |
|---|
| 237 | 237 | return cellAt(index).value; |
|---|
| … | … | |
| 241 | 241 | |
|---|
| 242 | 242 | Time complexity: O(n) |
|---|
| 243 | | |
|---|
| 244 | | ***********************************************************************/ |
|---|
| 245 | | |
|---|
| 246 | | final uint first (V value, uint startingIndex = 0) |
|---|
| | 243 | Returns size_t.max if no element found. |
|---|
| | 244 | |
|---|
| | 245 | ***********************************************************************/ |
|---|
| | 246 | |
|---|
| | 247 | final size_t first (V value, size_t startingIndex = 0) |
|---|
| 247 | 248 | { |
|---|
| 248 | 249 | if (list is null || startingIndex >= count) |
|---|
| 249 | | return uint.max; |
|---|
| | 250 | return size_t.max; |
|---|
| 250 | 251 | |
|---|
| 251 | 252 | if (startingIndex < 0) |
|---|
| … | … | |
| 259 | 260 | return i + startingIndex; |
|---|
| 260 | 261 | } |
|---|
| 261 | | return uint.max; |
|---|
| | 262 | return size_t.max; |
|---|
| 262 | 263 | } |
|---|
| 263 | 264 | |
|---|
| … | … | |
| 265 | 266 | |
|---|
| 266 | 267 | Time complexity: O(n) |
|---|
| 267 | | |
|---|
| 268 | | ***********************************************************************/ |
|---|
| 269 | | |
|---|
| 270 | | final uint last (V value, uint startingIndex = 0) |
|---|
| | 268 | Returns size_t.max if no element found. |
|---|
| | 269 | |
|---|
| | 270 | ***********************************************************************/ |
|---|
| | 271 | |
|---|
| | 272 | final size_t last (V value, size_t startingIndex = 0) |
|---|
| 271 | 273 | { |
|---|
| 272 | 274 | if (list is null) |
|---|
| 273 | | return uint.max; |
|---|
| | 275 | return size_t.max; |
|---|
| 274 | 276 | |
|---|
| 275 | 277 | auto i = 0; |
|---|
| … | … | |
| 277 | 279 | startingIndex = count - 1; |
|---|
| 278 | 280 | |
|---|
| 279 | | auto index = uint.max; |
|---|
| | 281 | auto index = size_t.max; |
|---|
| 280 | 282 | auto p = list; |
|---|
| 281 | 283 | while (i <= startingIndex && p) |
|---|
| … | … | |
| 295 | 297 | ***********************************************************************/ |
|---|
| 296 | 298 | |
|---|
| 297 | | final LinkedList subset (uint from, uint length = int.max) |
|---|
| | 299 | final LinkedList subset (size_t from, size_t length = size_t.max) |
|---|
| 298 | 300 | { |
|---|
| 299 | 301 | Ref newlist = null; |
|---|
| … | … | |
| 411 | 413 | ***********************************************************************/ |
|---|
| 412 | 414 | |
|---|
| 413 | | final uint remove (V value, bool all = false) |
|---|
| | 415 | final size_t remove (V value, bool all = false) |
|---|
| 414 | 416 | { |
|---|
| 415 | 417 | auto c = count; |
|---|
| … | … | |
| 454 | 456 | ***********************************************************************/ |
|---|
| 455 | 457 | |
|---|
| 456 | | final uint replace (V oldElement, V newElement, bool all = false) |
|---|
| 457 | | { |
|---|
| 458 | | uint c; |
|---|
| | 458 | final size_t replace (V oldElement, V newElement, bool all = false) |
|---|
| | 459 | { |
|---|
| | 460 | size_t c; |
|---|
| 459 | 461 | if (count && oldElement != newElement) |
|---|
| 460 | 462 | { |
|---|
| … | … | |
| 567 | 569 | ***********************************************************************/ |
|---|
| 568 | 570 | |
|---|
| 569 | | final LinkedList addAt (uint index, V value) |
|---|
| | 571 | final LinkedList addAt (size_t index, V value) |
|---|
| 570 | 572 | { |
|---|
| 571 | 573 | if (index is 0) |
|---|
| … | … | |
| 585 | 587 | ***********************************************************************/ |
|---|
| 586 | 588 | |
|---|
| 587 | | final LinkedList removeAt (uint index) |
|---|
| | 589 | final LinkedList removeAt (size_t index) |
|---|
| 588 | 590 | { |
|---|
| 589 | 591 | if (index is 0) |
|---|
| … | … | |
| 605 | 607 | ***********************************************************************/ |
|---|
| 606 | 608 | |
|---|
| 607 | | final LinkedList replaceAt (uint index, V value) |
|---|
| | 609 | final LinkedList replaceAt (size_t index, V value) |
|---|
| 608 | 610 | { |
|---|
| 609 | 611 | cellAt(index).value = value; |
|---|
| … | … | |
| 618 | 620 | ***********************************************************************/ |
|---|
| 619 | 621 | |
|---|
| 620 | | final uint prepend (IContainer!(V) e) |
|---|
| | 622 | final size_t prepend (IContainer!(V) e) |
|---|
| 621 | 623 | { |
|---|
| 622 | 624 | auto c = count; |
|---|
| … | … | |
| 631 | 633 | ***********************************************************************/ |
|---|
| 632 | 634 | |
|---|
| 633 | | final uint append (IContainer!(V) e) |
|---|
| | 635 | final size_t append (IContainer!(V) e) |
|---|
| 634 | 636 | { |
|---|
| 635 | 637 | auto c = count; |
|---|
| … | … | |
| 647 | 649 | ***********************************************************************/ |
|---|
| 648 | 650 | |
|---|
| 649 | | final uint addAt (uint index, IContainer!(V) e) |
|---|
| | 651 | final size_t addAt (size_t index, IContainer!(V) e) |
|---|
| 650 | 652 | { |
|---|
| 651 | 653 | auto c = count; |
|---|
| … | … | |
| 666 | 668 | ***********************************************************************/ |
|---|
| 667 | 669 | |
|---|
| 668 | | final uint removeRange (uint fromIndex, uint toIndex) |
|---|
| | 670 | final size_t removeRange (size_t fromIndex, size_t toIndex) |
|---|
| 669 | 671 | { |
|---|
| 670 | 672 | auto c = count; |
|---|
| … | … | |
| 674 | 676 | { |
|---|
| 675 | 677 | auto p = firstCell; |
|---|
| 676 | | for (int i = fromIndex; i <= toIndex; ++i) |
|---|
| | 678 | for (size_t i = fromIndex; i <= toIndex; ++i) |
|---|
| 677 | 679 | p = p.next; |
|---|
| 678 | 680 | list = p; |
|---|
| … | … | |
| 682 | 684 | auto f = cellAt (fromIndex - 1); |
|---|
| 683 | 685 | auto p = f; |
|---|
| 684 | | for (int i = fromIndex; i <= toIndex; ++i) |
|---|
| | 686 | for (size_t i = fromIndex; i <= toIndex; ++i) |
|---|
| 685 | 687 | p = p.next; |
|---|
| 686 | 688 | f.next = p.next; |
|---|
| … | … | |
| 710 | 712 | dst.length = count; |
|---|
| 711 | 713 | |
|---|
| 712 | | int i = 0; |
|---|
| | 714 | size_t i = 0; |
|---|
| 713 | 715 | foreach (v; this) |
|---|
| 714 | 716 | dst[i++] = v; |
|---|
| … | … | |
| 738 | 740 | assert((list is null || list.count is size)); |
|---|
| 739 | 741 | |
|---|
| 740 | | int c = 0; |
|---|
| | 742 | size_t c = 0; |
|---|
| 741 | 743 | for (Ref p = list; p; p = p.next) |
|---|
| 742 | 744 | { |
|---|
| … | … | |
| 755 | 757 | ***********************************************************************/ |
|---|
| 756 | 758 | |
|---|
| 757 | | private uint instances (V value) |
|---|
| | 759 | private size_t instances (V value) |
|---|
| 758 | 760 | { |
|---|
| 759 | 761 | if (count is 0) |
|---|
| … | … | |
| 787 | 789 | ***********************************************************************/ |
|---|
| 788 | 790 | |
|---|
| 789 | | private Ref cellAt (uint index) |
|---|
| | 791 | private Ref cellAt (size_t index) |
|---|
| 790 | 792 | { |
|---|
| 791 | 793 | checkIndex (index); |
|---|
| … | … | |
| 797 | 799 | ***********************************************************************/ |
|---|
| 798 | 800 | |
|---|
| 799 | | private void checkIndex (uint index) |
|---|
| | 801 | private void checkIndex (size_t index) |
|---|
| 800 | 802 | { |
|---|
| 801 | 803 | if (index >= count) |
|---|
| … | … | |
| 916 | 918 | prior; |
|---|
| 917 | 919 | LinkedList owner; |
|---|
| 918 | | uint mutation; |
|---|
| | 920 | size_t mutation; |
|---|
| 919 | 921 | |
|---|
| 920 | 922 | /*************************************************************** |
|---|
| r4312 |
r5064 |
|
| 44 | 44 | bool take (K key, ref V v) |
|---|
| 45 | 45 | bool removeKey (K key) |
|---|
| 46 | | uint remove (V value, bool all) |
|---|
| 47 | | uint remove (IContainer!(V) e, bool all) |
|---|
| | 46 | size_t remove (V value, bool all) |
|---|
| | 47 | size_t remove (IContainer!(V) e, bool all) |
|---|
| 48 | 48 | |
|---|
| 49 | 49 | bool add (K key, V value) |
|---|
| 50 | | uint replace (V oldElement, V newElement, bool all) |
|---|
| | 50 | size_t replace (V oldElement, V newElement, bool all) |
|---|
| 51 | 51 | bool replacePair (K key, V oldElement, V newElement) |
|---|
| 52 | 52 | bool opIndexAssign (V element, K key) |
|---|
| … | … | |
| 55 | 55 | V* opIn_r (K key) |
|---|
| 56 | 56 | |
|---|
| 57 | | uint size () |
|---|
| | 57 | size_t size () |
|---|
| 58 | 58 | bool isEmpty () |
|---|
| 59 | 59 | V[] toArray (V[] dst) |
|---|
| … | … | |
| 87 | 87 | private Compare!(V) cmpElem; |
|---|
| 88 | 88 | |
|---|
| 89 | | private int count, |
|---|
| | 89 | private size_t count, |
|---|
| 90 | 90 | mutation; |
|---|
| 91 | 91 | |
|---|
| … | … | |
| 108 | 108 | ***********************************************************************/ |
|---|
| 109 | 109 | |
|---|
| 110 | | private this (Comparator c, int n) |
|---|
| | 110 | private this (Comparator c, size_t n) |
|---|
| 111 | 111 | { |
|---|
| 112 | 112 | count = n; |
|---|
| … | … | |
| 177 | 177 | ***********************************************************************/ |
|---|
| 178 | 178 | |
|---|
| 179 | | final uint size () |
|---|
| | 179 | final size_t size () |
|---|
| 180 | 180 | { |
|---|
| 181 | 181 | return count; |
|---|
| … | … | |
| 439 | 439 | ************************************************************************/ |
|---|
| 440 | 440 | |
|---|
| 441 | | final uint remove (IContainer!(V) e, bool all) |
|---|
| | 441 | final size_t remove (IContainer!(V) e, bool all) |
|---|
| 442 | 442 | { |
|---|
| 443 | 443 | auto c = count; |
|---|
| … | … | |
| 453 | 453 | ***********************************************************************/ |
|---|
| 454 | 454 | |
|---|
| 455 | | final uint remove (V value, bool all = false) |
|---|
| | 455 | final size_t remove (V value, bool all = false) |
|---|
| 456 | 456 | { |
|---|
| 457 | | uint i = count; |
|---|
| | 457 | size_t i = count; |
|---|
| 458 | 458 | if (count) |
|---|
| 459 | 459 | { |
|---|
| … | … | |
| 477 | 477 | ***********************************************************************/ |
|---|
| 478 | 478 | |
|---|
| 479 | | final uint replace (V oldElement, V newElement, bool all = false) |
|---|
| 480 | | { |
|---|
| 481 | | uint c; |
|---|
| | 479 | final size_t replace (V oldElement, V newElement, bool all = false) |
|---|
| | 480 | { |
|---|
| | 481 | size_t c; |
|---|
| 482 | 482 | |
|---|
| 483 | 483 | if (count) |
|---|
| … | … | |
| 637 | 637 | dst.length = count; |
|---|
| 638 | 638 | |
|---|
| 639 | | int i = 0; |
|---|
| | 639 | size_t i = 0; |
|---|
| 640 | 640 | foreach (k, v; this) |
|---|
| 641 | 641 | dst[i++] = v; |
|---|
| … | … | |
| 701 | 701 | ***********************************************************************/ |
|---|
| 702 | 702 | |
|---|
| 703 | | private uint instances (V value) |
|---|
| | 703 | private size_t instances (V value) |
|---|
| 704 | 704 | { |
|---|
| 705 | 705 | if (count is 0) |
|---|
| … | … | |
| 895 | 895 | prior; |
|---|
| 896 | 896 | SortedMap owner; |
|---|
| 897 | | uint mutation; |
|---|
| | 897 | size_t mutation; |
|---|
| 898 | 898 | |
|---|
| 899 | 899 | /*************************************************************** |
|---|
| r4008 |
r5064 |
|
| 23 | 23 | interface IContainer (V) |
|---|
| 24 | 24 | { |
|---|
| 25 | | uint size (); |
|---|
| | 25 | size_t size (); |
|---|
| 26 | 26 | |
|---|
| 27 | 27 | bool isEmpty (); |
|---|
| … | … | |
| 41 | 41 | V[] toArray (V[] dst = null); |
|---|
| 42 | 42 | |
|---|
| 43 | | uint remove (V element, bool all); |
|---|
| | 43 | size_t remove (V element, bool all); |
|---|
| 44 | 44 | |
|---|
| 45 | 45 | int opApply (int delegate(ref V value) dg); |
|---|
| 46 | 46 | |
|---|
| 47 | | uint replace (V oldElement, V newElement, bool all); |
|---|
| | 47 | size_t replace (V oldElement, V newElement, bool all); |
|---|
| 48 | 48 | } |
|---|
| 49 | 49 | |
|---|
Download in other formats:
|
 |