Go to the documentation of this file.00001 #ifndef FWCore_Utilities_ThreadSafeIndexedRegistry_h
00002 #define FWCore_Utilities_ThreadSafeIndexedRegistry_h
00003
00004 #include <vector>
00005 #include "boost/thread.hpp"
00006
00007
00008
00016
00017
00018 #pragma GCC visibility push(default)
00019 namespace edm {
00020 namespace detail {
00021 struct Empty { };
00022
00023 template <typename T, typename E=Empty>
00024 class ThreadSafeIndexedRegistry {
00025 public:
00026 typedef T value_type;
00027 typedef E extra_type;
00028 typedef typename std::vector<value_type> collection_type;
00029 typedef typename collection_type::size_type size_type;
00030
00031 typedef typename collection_type::const_iterator const_iterator;
00032
00033 static ThreadSafeIndexedRegistry* instance();
00034
00040 void getMapped(size_type index, value_type& result) const;
00041
00044 bool insertMapped(value_type const& v);
00045
00048 void insertCollection(collection_type const& c);
00049
00051 bool empty() const;
00052
00054 bool notEmpty() const;
00055
00057 size_type size() const;
00058
00061 const_iterator begin() const;
00062 const_iterator end() const;
00063
00065 void print(std::ostream& os) const;
00066
00068 collection_type& data();
00069 collection_type const& data() const;
00070
00074 extra_type& extra();
00075 extra_type const& extra() const;
00076
00077 private:
00078 ThreadSafeIndexedRegistry();
00079 ~ThreadSafeIndexedRegistry();
00080
00081
00082 ThreadSafeIndexedRegistry(ThreadSafeIndexedRegistry<T, E> const&);
00083
00084 ThreadSafeIndexedRegistry<T, E>&
00085 operator= (ThreadSafeIndexedRegistry<T, E> const&);
00086
00087 collection_type data_;
00088 extra_type extra_;
00089
00090 };
00091
00092 template <typename T, typename E>
00093 inline
00094 std::ostream&
00095 operator<< (std::ostream& os, ThreadSafeIndexedRegistry<T, E> const& reg) {
00096 reg.print(os);
00097 return os;
00098 }
00099
00100 template <typename T, typename E>
00101 void
00102 ThreadSafeIndexedRegistry<T, E>::insertCollection(collection_type const& c) {
00103 for (typename collection_type::const_iterator it = c.begin(), itEnd = c.end(); it != itEnd; ++it) {
00104 insertMapped(*it);
00105 }
00106 }
00107
00108 template <typename T, typename E>
00109 inline
00110 bool
00111 ThreadSafeIndexedRegistry<T, E>::empty() const {
00112 return data_.empty();
00113 }
00114
00115 template <typename T, typename E>
00116 inline
00117 bool
00118 ThreadSafeIndexedRegistry<T, E>::notEmpty() const {
00119 return !empty();
00120 }
00121
00122 template <typename T, typename E>
00123 inline
00124 typename ThreadSafeIndexedRegistry<T, E>::size_type
00125 ThreadSafeIndexedRegistry<T, E>::size() const {
00126 return data_.size();
00127 }
00128
00129 template <typename T, typename E>
00130 inline
00131 typename ThreadSafeIndexedRegistry<T, E>::const_iterator
00132 ThreadSafeIndexedRegistry<T, E>::begin() const {
00133 return data_.begin();
00134 }
00135
00136 template <typename T, typename E>
00137 inline
00138 typename ThreadSafeIndexedRegistry<T, E>::const_iterator
00139 ThreadSafeIndexedRegistry<T, E>::end() const {
00140 return data_.end();
00141 }
00142
00143 template <typename T, typename E>
00144 void
00145 ThreadSafeIndexedRegistry<T, E>::print(std::ostream& os) const {
00146 os << "Registry with " << size() << " entries\n";
00147 for (const_iterator i = begin(), e = end(); i != e; ++i) {
00148 os << i - begin() << " " << i << '\n';
00149 }
00150 }
00151
00152 template <typename T, typename E>
00153 inline
00154 typename ThreadSafeIndexedRegistry<T, E>::collection_type&
00155 ThreadSafeIndexedRegistry<T, E>::data() {
00156 return data_;
00157 }
00158
00159 template <typename T, typename E>
00160 inline
00161 typename ThreadSafeIndexedRegistry<T, E>::extra_type&
00162 ThreadSafeIndexedRegistry<T, E>::extra() {
00163 return extra_;
00164 }
00165
00166 template <typename T, typename E>
00167 inline
00168 typename ThreadSafeIndexedRegistry<T, E>::extra_type const&
00169 ThreadSafeIndexedRegistry<T, E>::extra() const {
00170 return extra_;
00171 }
00172
00173 template <typename T, typename E>
00174 inline
00175 typename ThreadSafeIndexedRegistry<T, E>::collection_type const&
00176 ThreadSafeIndexedRegistry<T, E>::data() const {
00177 return data_;
00178 }
00179
00180 template <typename T, typename E>
00181 ThreadSafeIndexedRegistry<T, E>::ThreadSafeIndexedRegistry() :
00182 data_()
00183 { }
00184
00185
00186 template <typename T, typename E>
00187 ThreadSafeIndexedRegistry<T, E>::~ThreadSafeIndexedRegistry()
00188 { }
00189
00190 }
00191 }
00192 #pragma GCC visibility pop
00193
00194 #endif // FWCore_Utilities_ThreadSafeIndexedRegistry_h