write-copy.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #ifndef _WRITE_COPY_HPP_
  2. #define _WRITE_COPY_HPP_
  3. #include <unordered_map>
  4. #include <algorithm>
  5. #include <memory>
  6. #include <mutex>
  7. #include "visit.h"
  8. template<typename T,typename K,typename V>
  9. struct write_copy_base:acceptor<V>
  10. {
  11. void accept(visitor<V> &v)
  12. {
  13. for(std::pair<K,V> me:m_map)
  14. {
  15. v.visit(me.second);
  16. }
  17. }
  18. std::unordered_map<K,V> m_map;
  19. write_copy_base()
  20. {
  21. }
  22. V get(K k)const
  23. {
  24. return m_map[k];
  25. }
  26. V get(K k)
  27. {
  28. auto serch = m_map.find(k);
  29. if(serch != m_map.end())
  30. return serch->second;
  31. else
  32. return nullptr;
  33. }
  34. std::shared_ptr<T> clone()const
  35. {
  36. std::shared_ptr<T> ret=std::make_shared<T>();
  37. ret->m_map.insert(m_map.begin(),m_map.end());
  38. return ret;
  39. }
  40. std::shared_ptr<T> clone_add(const std::unordered_map<K,V>&m)const
  41. {
  42. std::shared_ptr<T> ret=std::move(clone());
  43. ret->_add(m);
  44. return ret;
  45. }
  46. std::shared_ptr<T> clone_add(K k,V v)const
  47. {
  48. std::shared_ptr<T> ret=std::move(clone());
  49. ret->_add(k,v);
  50. return ret;
  51. }
  52. std::shared_ptr<T> clone_remove(K k)const
  53. {
  54. std::shared_ptr<T> ret=std::move(clone());
  55. ret->_remove(k);
  56. return ret;
  57. }
  58. std::shared_ptr<T> clone_remove(const std::vector<K>&list)const
  59. {
  60. std::shared_ptr<T> ret=std::move(clone());
  61. ret->_remove(list);
  62. return ret;
  63. }
  64. virtual ~write_copy_base()
  65. {
  66. // std::for_each(m_list.begin(),m_list.end(),[](K*it){ });
  67. }
  68. private:
  69. void _remove(K k)
  70. {
  71. m_map.erase(k);
  72. }
  73. void _remove(const std::vector<K>& v)
  74. {
  75. for(K&k:v)
  76. {
  77. m_map.erase(k);
  78. }
  79. }
  80. void _add(K k,V v)
  81. {
  82. m_map.insert(std::make_pair(k,v));
  83. }
  84. void _add(const std::unordered_map<K,V>&m)
  85. {
  86. m_map.insert(m.begin(),m.end());
  87. }
  88. };
  89. template<typename T,typename K,typename V>
  90. struct single_base:write_copy_base<T,K,V>
  91. {
  92. typedef write_copy_base<T,K,V> base;
  93. static std::shared_ptr<T> m_instance;
  94. static std::shared_ptr<T> instance()
  95. {
  96. return m_instance;
  97. }
  98. std::mutex m_mutex;
  99. void add(K k,V c)
  100. {
  101. std::lock_guard<std::mutex> lock(m_mutex);
  102. m_instance=std::move(base::clone_add(k,c));
  103. }
  104. void add(const std::unordered_map<K,V>&c)
  105. {
  106. std::lock_guard<std::mutex> lock(m_mutex);
  107. m_instance=std::move(base::clone_add(c));
  108. }
  109. void remove(K k,V c)
  110. {
  111. std::lock_guard<std::mutex> lock(m_mutex);
  112. m_instance=std::move(base::clone_remove(k,c));
  113. }
  114. void remove(const std::unordered_map<K,V>&c)
  115. {
  116. std::lock_guard<std::mutex> lock(m_mutex);
  117. m_instance=std::move(base::clone_remove(c));
  118. }
  119. };
  120. #endif