1 /******************************************************************************* 2 3 Mapping from key to the time-to-index mapping of an item in the cache. 4 Limits the number of available mappings to a fixed value and preallocates 5 all bucket elements in an array buffer. 6 7 Copyright: 8 Copyright (c) 2009-2016 dunnhumby Germany GmbH. 9 All rights reserved. 10 11 License: 12 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details. 13 Alternatively, this file may be distributed under the terms of the Tango 14 3-Clause BSD License (see LICENSE_BSD.txt for details). 15 16 *******************************************************************************/ 17 18 module ocean.util.container.cache.model.containers.KeyToNode; 19 20 21 import ocean.util.container.map.HashMap; 22 import ocean.util.container.map.model.BucketElementFreeList; 23 import ocean.util.container.cache.model.containers.ArrayPool; 24 import ocean.util.container.cache.model.containers.TimeToIndex; 25 26 /******************************************************************************/ 27 28 class KeyToNode: HashMap!(TimeToIndex.Node*) 29 { 30 static class ArrayAllocatedFreeBucketElements: BucketElementFreeList!(Bucket.Element) 31 { 32 /*********************************************************************** 33 34 Preallocated pool of bucket elements. 35 36 ***********************************************************************/ 37 38 private GenericArrayPool pool; 39 40 /*********************************************************************** 41 42 Constructor. 43 44 Params: 45 n = number of elements in the pool 46 47 ***********************************************************************/ 48 49 private this ( size_t n ) 50 { 51 this.pool = new GenericArrayPool(n, Bucket.Element.sizeof); 52 } 53 54 /*********************************************************************** 55 56 Obtains a new element from the pool. 57 58 Returns: 59 A new pool element. 60 61 ***********************************************************************/ 62 63 protected override Bucket.Element* newElement ( ) 64 { 65 return cast(Bucket.Element*)this.pool.next; 66 } 67 } 68 69 /*************************************************************************** 70 71 Bucket elements allocator. 72 The elements are allocated only during container construction, 73 and never freed. 74 75 ***************************************************************************/ 76 77 private ArrayAllocatedFreeBucketElements allocator; 78 79 /*********************************************************************** 80 81 Constructor. 82 83 Params: 84 n = maximum number of elements in mapping 85 86 ***********************************************************************/ 87 88 public this ( size_t n ) 89 { 90 this.allocator = new ArrayAllocatedFreeBucketElements(n); 91 super(this.allocator, n); 92 } 93 } 94 95 unittest 96 { 97 KeyToNode map = new KeyToNode(5); 98 (*map.put(1)) = new TimeToIndex.Node(); 99 (*map.put(2)) = new TimeToIndex.Node(); 100 (*map.put(3)) = new TimeToIndex.Node(); 101 (*map.put(4)) = new TimeToIndex.Node(); 102 (*map.put(5)) = new TimeToIndex.Node(); 103 map.clear(); 104 map.clear(); 105 map.clear(); 106 } 107 108 unittest 109 { 110 KeyToNode map = new KeyToNode(100000); 111 map.clear(); 112 map.put(9207674216414740734); 113 map.put(8595442437537477107); 114 map.clear(); 115 map.put(8595442437537477107); 116 map.clear(); 117 map.put(9207674216414740734); 118 map.put(8595442437537477106); 119 map.put(8595442437537477108); 120 map.put(8595442437537477110); 121 map.put(8595442437537477112); 122 map.clear(); 123 }