Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.99 KB | None | 0 0
  1. /*
  2. CONCEPT SKETCH:
  3. Singleton Cache Manager Using Custom Smart Pointer Deleters
  4. by Patrick Hebron
  5. */
  6.  
  7. #include <iostream>
  8. #include <memory>
  9. #include <map>
  10.  
  11. typedef std::shared_ptr<class Object> ObjectRef;
  12. typedef std::shared_ptr<class Derived> DerivedRef;
  13.  
  14. class Object
  15. {
  16. public:
  17.  
  18. std::string name;
  19.  
  20. Object(const std::string& n = "") : name( n ) { std::cout << "Object(" << name << ")" << std::endl; }
  21. virtual ~Object() { std::cout << "~Object(" << name << ")" << std::endl; }
  22.  
  23. virtual void init() { std::cout << "Object::init(" << name << ")" << std::endl; }
  24.  
  25. void testA() { std::cout << "Object::testA(" << name << ")" << std::endl; }
  26. virtual void testB() { std::cout << "Object::testB(" << name << ")" << std::endl; }
  27. };
  28.  
  29. class Derived : public Object
  30. {
  31. public:
  32.  
  33. Derived(const std::string& n = "") : Object( n ) { std::cout << "Derived(" << name << ")" << std::endl; }
  34. ~Derived() { std::cout << "~Derived(" << name << ")" << std::endl; }
  35.  
  36. void testB() { std::cout << "Derived::testB(" << name << ")" << std::endl; }
  37. };
  38.  
  39. /** @brief cache manager singleton class */
  40. struct CacheManager
  41. {
  42. private:
  43.  
  44. std::map<uintptr_t,int> mItems;
  45.  
  46. bool cache_contains(uintptr_t key) const
  47. {
  48. return ( mItems.find( key ) != mItems.cend() );
  49. }
  50.  
  51. void cache_remove(uintptr_t key)
  52. {
  53. auto needle = mItems.find( key );
  54. if( needle != mItems.end() )
  55. mItems.erase( needle );
  56. }
  57.  
  58. void cache_insert(uintptr_t key, int value)
  59. {
  60. mItems[ key ] = value;
  61. }
  62.  
  63. int cache_retrieve(uintptr_t key) const
  64. {
  65. auto needle = mItems.find( key );
  66. if( needle != mItems.cend() )
  67. return needle->second;
  68. throw std::runtime_error( "Cache manager could not retrieve item." );
  69. }
  70.  
  71. public:
  72.  
  73. static CacheManager* get()
  74. {
  75. static CacheManager* manager = NULL;
  76.  
  77. if( manager == NULL )
  78. manager = new CacheManager();
  79.  
  80. return manager;
  81. }
  82.  
  83. static uintptr_t cast_key(const Object* obj)
  84. {
  85. return reinterpret_cast<uintptr_t>( obj );
  86. }
  87.  
  88. static bool contains(const Object* key)
  89. {
  90. std::cout << "CacheManager::contains(" << key->name << ")" << std::endl;
  91.  
  92. return get()->cache_contains( cast_key( key ) );
  93. }
  94.  
  95. static void remove(const Object* key)
  96. {
  97. std::cout << "CacheManager::remove(" << key->name << ")" << std::endl;
  98.  
  99. get()->cache_remove( cast_key( key ) );
  100. }
  101.  
  102. static void insert(const Object* key, int value)
  103. {
  104. std::cout << "CacheManager::insert(" << key->name << ")" << std::endl;
  105.  
  106. get()->cache_insert( cast_key( key ), value );
  107. }
  108.  
  109. static int retrieve(const Object* key)
  110. {
  111. std::cout << "CacheManager::retrieve(" << key->name << ")" << std::endl;
  112.  
  113. return get()->cache_retrieve( cast_key( key ) );
  114. }
  115. };
  116.  
  117. static void CachedObjectDeleter(Object* item)
  118. {
  119. CacheManager::remove( item );
  120.  
  121. std::cout << "CachedObjectDeleter(" << item->name << ")" << std::endl;
  122.  
  123. delete item;
  124. }
  125.  
  126. using namespace std;
  127.  
  128. int main(int argc, const char * argv[])
  129. {
  130. std::cout << std::string( 20, '-' ) << std::endl;
  131.  
  132. {
  133. ObjectRef item = ObjectRef( new Object("item0") );
  134. item->testA();
  135. item->testB();
  136. }
  137.  
  138. std::cout << std::string( 20, '-' ) << std::endl;
  139.  
  140. {
  141. ObjectRef item = ObjectRef( new Object("item1"), CachedObjectDeleter );
  142. item->testA();
  143. item->testB();
  144. }
  145.  
  146. std::cout << std::string( 20, '-' ) << std::endl;
  147.  
  148. {
  149. ObjectRef item = ObjectRef( new Derived("item2") );
  150. CacheManager::insert( item.get(), 2 );
  151. item->testA();
  152. item->testB();
  153. }
  154.  
  155. std::cout << std::string( 20, '-' ) << std::endl;
  156.  
  157. {
  158. ObjectRef item = ObjectRef( new Derived("item3"), CachedObjectDeleter );
  159. CacheManager::insert( item.get(), 3 );
  160. item->testA();
  161. item->testB();
  162. }
  163.  
  164. std::cout << std::string( 20, '-' ) << std::endl;
  165.  
  166. {
  167. DerivedRef item = DerivedRef( new Derived("item4") );
  168. CacheManager::insert( item.get(), 4 );
  169. item->testA();
  170. item->testB();
  171. }
  172.  
  173. std::cout << std::string( 20, '-' ) << std::endl;
  174.  
  175. {
  176. DerivedRef item = DerivedRef( new Derived("item5"), CachedObjectDeleter );
  177. CacheManager::insert( item.get(), 5 );
  178. item->testA();
  179. item->testB();
  180. }
  181.  
  182. std::cout << std::string( 20, '-' ) << std::endl;
  183.  
  184. return 0;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement