8#ifndef INCLUDED_BDLCC_CACHE
9#define INCLUDED_BDLCC_CACHE
350#include <bslim_printer.h>
368#include <bsl_memory.h>
370#include <bsl_unordered_map.h>
372#include <bsl_vector.h>
373#include <bsl_functional.h>
374#include <bsl_iostream.h>
375#include <bsl_limits.h>
376#include <bsl_cstddef.h>
490 bsl::size_t d_lowWatermark;
494 bsl::size_t d_highWatermark;
512 void enforceHighWatermark();
526 bool insertValuePtrMoveImp(KEY *key_p,
593 template <
class INPUT_ITERATOR>
594 int eraseBulk(INPUT_ITERATOR begin, INPUT_ITERATOR end);
609 void insert(
const KEY& key,
const VALUE& value);
628 template <
class INPUT_ITERATOR>
664 bool modifyEvictionQueue =
true);
695 template <
class VISITOR>
749 return !d_queue_p || d_queue_p->empty() ? 0
750 : &*d_queue_p->rbegin();
766 while (last() != d_last_p) {
767 d_queue_p->pop_back();
785template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
787: d_allocator_p(
bslma::Default::allocator(basicAllocator))
788, d_map(d_allocator_p)
789, d_queue(d_allocator_p)
791, d_lowWatermark(
bsl::numeric_limits<
bsl::size_t>::max())
792, d_highWatermark(
bsl::numeric_limits<
bsl::size_t>::max())
793, d_postEvictionCallback(
bsl::allocator_arg, d_allocator_p)
797template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
800 bsl::size_t lowWatermark,
801 bsl::size_t highWatermark,
803: d_allocator_p(
bslma::Default::allocator(basicAllocator))
804, d_map(d_allocator_p)
805, d_queue(d_allocator_p)
806, d_evictionPolicy(evictionPolicy)
807, d_lowWatermark(lowWatermark)
808, d_highWatermark(highWatermark)
809, d_postEvictionCallback(
bsl::allocator_arg, d_allocator_p)
816template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
819 bsl::size_t lowWatermark,
820 bsl::size_t highWatermark,
821 const HASH& hashFunction,
822 const EQUAL& equalFunction,
824: d_allocator_p(
bslma::Default::allocator(basicAllocator))
825, d_map(0, hashFunction, equalFunction, d_allocator_p)
826, d_queue(d_allocator_p)
827, d_evictionPolicy(evictionPolicy)
828, d_lowWatermark(lowWatermark)
829, d_highWatermark(highWatermark)
830, d_postEvictionCallback(
bsl::allocator_arg, d_allocator_p)
838template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
841 if (d_map.size() < d_highWatermark) {
845 while (d_map.size() >= d_lowWatermark && d_map.size() > 0) {
846 const typename MapType::iterator mapIt = d_map.find(d_queue.front());
852template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
853void Cache<KEY, VALUE, HASH, EQUAL>::evictItem(
854 const typename MapType::iterator& mapIt)
856 ValuePtrType value = mapIt->second.first;
858 d_queue.erase(mapIt->second.second);
861 if (d_postEvictionCallback) {
862 d_postEvictionCallback(value);
865template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
867bool Cache<KEY, VALUE, HASH, EQUAL>::insertValuePtrMoveImp(
870 ValuePtrType *valuePtr_p,
873#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
874 enum { k_RVALUE_ASSIGN =
true };
876 enum { k_RVALUE_ASSIGN =
false };
879 enforceHighWatermark();
882 ValuePtrType& valuePtr = *valuePtr_p;
884 typename MapType::iterator mapIt = d_map.find(key);
885 if (mapIt != d_map.end()) {
886 if (k_RVALUE_ASSIGN && moveValuePtr) {
890 mapIt->second.first = valuePtr;
893 typename QueueType::iterator queueIt = mapIt->second.second;
897 d_queue.splice(d_queue.end(), d_queue, queueIt);
902 Cache_QueueProctor<KEY> proctor(&d_queue);
903 d_queue.push_back(key);
904 typename QueueType::iterator queueIt = d_queue.end();
908 MapValue *mapValue_p = mapValueFootprint.
address();
916 new (mapValue_p) MapValue(valuePtr,
938template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
946template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
951 const typename MapType::iterator mapIt = d_map.find(key);
952 if (mapIt == d_map.end()) {
960template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
961template <
class INPUT_ITERATOR>
968 for (; begin != end; ++begin) {
969 const typename MapType::iterator mapIt = d_map.find(*begin);
970 if (mapIt == d_map.end()) {
980template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
984 return eraseBulk(keys.
begin(), keys.
end());
987template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
993 KEY *key_p =
const_cast<KEY *
>(&key);
994 ValuePtrType valuePtr = bsl::allocate_shared<VALUE>(d_allocator_p, value);
996 insertValuePtrMoveImp(key_p,
false, &valuePtr,
true);
999template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1005 KEY *key_p =
const_cast<KEY *
>(&key);
1011 insertValuePtrMoveImp(key_p,
false, &valuePtr,
true);
1014template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1020 KEY& localKey = key;
1021 ValuePtrType valuePtr = bsl::allocate_shared<VALUE>(d_allocator_p, value);
1024 insertValuePtrMoveImp(&localKey,
true, &valuePtr,
true);
1027template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1033 KEY& localKey = key;
1039 insertValuePtrMoveImp(&localKey,
true, &valuePtr,
true);
1042template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1049 KEY *key_p =
const_cast<KEY *
>(&key);
1052 insertValuePtrMoveImp(key_p,
false, valuePtr_p,
false);
1055template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1061 KEY& localKey = key;
1064 insertValuePtrMoveImp(&localKey,
true, valuePtr_p,
false);
1067template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1068template <
class INPUT_ITERATOR>
1075 for (; begin != end; ++begin) {
1076 KEY *key_p =
const_cast<KEY *
>( &begin->first);
1079 count += insertValuePtrMoveImp(key_p,
false, valuePtr_p,
false);
1085template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1089 return insertBulk(data.begin(), data.end());
1092template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1103 for (
typename Vec::iterator it = local.begin(); it < local.end(); ++it) {
1104 KEY *key_p = &it->first;
1107 count += insertValuePtrMoveImp(key_p,
true, valuePtr_p,
true);
1112template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1118 if (d_map.size() > 0) {
1119 const typename MapType::iterator mapIt = d_map.find(d_queue.front());
1128template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1133 d_postEvictionCallback = postEvictionCallback;
1136template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1140 bool modifyEvictionQueue)
1143 modifyEvictionQueue ? 1 : 0;
1145 d_rwlock.lockWrite();
1148 d_rwlock.lockRead();
1157 typename MapType::iterator mapIt = d_map.find(key);
1158 if (mapIt == d_map.end()) {
1162 *value = mapIt->second.first;
1168 if (last != queueIt) {
1169 d_queue.splice(d_queue.end(), d_queue, queueIt);
1177template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1181 return d_map.key_eq();
1184template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1189 return d_evictionPolicy;
1192template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1196 return d_map.hash_function();
1199template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1203 return d_highWatermark;
1206template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1210 return d_lowWatermark;
1213template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1218 return d_map.size();
1221template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1222template <
class VISITOR>
1228 queueIt != d_queue.end(); ++queueIt) {
1230 const KEY& key = *queueIt;
1235 if (!visitor(key, *valuePtr)) {
1246template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1255template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1259 d_cache.d_rwlock.lockRead();
1262template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1266 d_cache.d_rwlock.lockWrite();
1269template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
1273 d_cache.d_rwlock.unlock();
1281template <
class KEY,
class VALUE,
class HASH,
class EQUAL>
Definition bdlcc_cache.h:400
Cache_QueueProctor(bsl::list< KEY > *queue)
Create a Cache_QueueProctor object to monitor the specified queue.
Definition bdlcc_cache.h:756
void release()
Definition bdlcc_cache.h:775
~Cache_QueueProctor()
Definition bdlcc_cache.h:763
Definition bdlcc_cache.h:708
void lockRead()
Call the lockRead method of bdlcc::Cache d_rwlock lock.
Definition bdlcc_cache.h:1257
~Cache_TestUtil()=default
Destroy this object.
void unlock()
Call the unlock method of bdlcc::Cache d_rwlock lock.
Definition bdlcc_cache.h:1271
Cache_TestUtil(Cache< KEY, VALUE, HASH, EQUAL > &cache)
Definition bdlcc_cache.h:1248
void lockWrite()
Call the lockWrite method of bdlcc::Cache d_rwlock lock.
Definition bdlcc_cache.h:1264
Definition bdlcc_cache.h:444
bsl::size_t lowWatermark() const
Definition bdlcc_cache.h:1208
void clear()
Definition bdlcc_cache.h:939
void insert(bslmf::MovableRef< KEY > key, const ValuePtrType &valuePtr)
Definition bdlcc_cache.h:1056
HASH hashFunction() const
Definition bdlcc_cache.h:1194
int insertBulk(bslmf::MovableRef< bsl::vector< KVType > > data)
Definition bdlcc_cache.h:1093
void insert(const KEY &key, bslmf::MovableRef< VALUE > value)
Definition bdlcc_cache.h:1000
bsl::size_t size() const
Return the current size of this cache.
Definition bdlcc_cache.h:1215
int tryGetValue(bsl::shared_ptr< VALUE > *value, const KEY &key, bool modifyEvictionQueue=true)
Definition bdlcc_cache.h:1137
int insertBulk(const bsl::vector< KVType > &data)
Definition bdlcc_cache.h:1087
void insert(const KEY &key, const VALUE &value)
Definition bdlcc_cache.h:989
void insert(const KEY &key, const ValuePtrType &valuePtr)
Definition bdlcc_cache.h:1044
Cache(bslma::Allocator *basicAllocator=0)
Definition bdlcc_cache.h:786
void visit(VISITOR &visitor) const
Definition bdlcc_cache.h:1223
int eraseBulk(INPUT_ITERATOR begin, INPUT_ITERATOR end)
Definition bdlcc_cache.h:962
bsl::pair< KEY, ValuePtrType > KVType
Value type of a bulk insert entry.
Definition bdlcc_cache.h:456
void insert(bslmf::MovableRef< KEY > key, bslmf::MovableRef< VALUE > value)
Definition bdlcc_cache.h:1028
Cache(CacheEvictionPolicy::Enum evictionPolicy, bsl::size_t lowWatermark, bsl::size_t highWatermark, bslma::Allocator *basicAllocator=0)
Definition bdlcc_cache.h:798
bsl::function< void(const ValuePtrType &)> PostEvictionCallback
Type of function to call after an item has been evicted from the cache.
Definition bdlcc_cache.h:453
Cache(CacheEvictionPolicy::Enum evictionPolicy, bsl::size_t lowWatermark, bsl::size_t highWatermark, const HASH &hashFunction, const EQUAL &equalFunction, bslma::Allocator *basicAllocator=0)
Definition bdlcc_cache.h:817
void insert(bslmf::MovableRef< KEY > key, const VALUE &value)
Definition bdlcc_cache.h:1015
~Cache()=default
Destroy this object.
CacheEvictionPolicy::Enum evictionPolicy() const
Return the eviction policy used by this cache.
Definition bdlcc_cache.h:1187
EQUAL equalFunction() const
Definition bdlcc_cache.h:1179
int eraseBulk(const bsl::vector< KEY > &keys)
Definition bdlcc_cache.h:982
int insertBulk(INPUT_ITERATOR begin, INPUT_ITERATOR end)
Definition bdlcc_cache.h:1069
void setPostEvictionCallback(const PostEvictionCallback &postEvictionCallback)
Definition bdlcc_cache.h:1129
int popFront()
Definition bdlcc_cache.h:1114
bsl::shared_ptr< VALUE > ValuePtrType
Shared pointer type pointing to value type.
Definition bdlcc_cache.h:450
int erase(const KEY &key)
Definition bdlcc_cache.h:947
bsl::size_t highWatermark() const
Definition bdlcc_cache.h:1201
Forward declaration.
Definition bslstl_function.h:946
Forward declaration required by List_NodeProctor.
Definition bslstl_list.h:1078
List_Iterator< KEY > iterator
Definition bslstl_list.h:1115
List_Iterator< const KEY > const_iterator
Definition bslstl_list.h:1116
Definition bslstl_pair.h:1280
Definition bslstl_sharedptr.h:1838
Definition bslstl_unorderedmap.h:1123
BloombergLP::bslstl::HashTableIterator< value_type, difference_type > iterator
Definition bslstl_unorderedmap.h:1233
BloombergLP::bslstl::HashTableIterator< const value_type, difference_type > const_iterator
Definition bslstl_unorderedmap.h:1235
iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:2866
iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:2874
Definition bslstl_vector.h:1120
Definition bslma_allocator.h:545
Definition bslma_destructorguard.h:132
Definition bslmf_movableref.h:752
Definition bslmt_readlockguard.h:287
Definition bslmt_readerwritermutex.h:244
Definition bslmt_writelockguard.h:221
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_REVIEW(X)
Definition bsls_review.h:1019
Definition bdlcc_boundedqueue.h:270
Definition bdlat_valuetypefunctions.h:939
Definition baljsn_encoder_testtypes.h:76
Definition bdlcc_cache.h:381
Enum
Enumeration of supported cache eviction policies.
Definition bdlcc_cache.h:386
@ e_LRU
Definition bdlcc_cache.h:388
@ e_FIFO
Definition bdlcc_cache.h:389
Definition bslstl_equalto.h:316
Definition bslstl_hash.h:495
Definition bslma_usesbslmaallocator.h:344
static MovableRef< t_TYPE > move(t_TYPE &reference) BSLS_KEYWORD_NOEXCEPT
Definition bslmf_movableref.h:1067
Definition bsls_objectbuffer.h:277
TYPE * address()
Definition bsls_objectbuffer.h:335