GTSAM  4.0.2
C++ library for smoothing and mapping (SAM)
ConcurrentMap.h
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
19 #pragma once
20 
21 #include <gtsam/global_includes.h>
22 
23 // Change class depending on whether we are using TBB
24 #ifdef GTSAM_USE_TBB
25 
26 // Include TBB header
27 # include <tbb/concurrent_unordered_map.h>
28 # undef min // TBB seems to include Windows.h which defines these macros that cause problems
29 # undef max
30 # undef ERROR
31 
32 #include <functional> // std::hash()
33 
34 // Use TBB concurrent_unordered_map for ConcurrentMap
35 template <typename KEY, typename VALUE>
36 using ConcurrentMapBase = tbb::concurrent_unordered_map<
37  KEY,
38  VALUE,
39  std::hash<KEY>
40  >;
41 
42 #else
43 
44 // If we're not using TBB, use a FastMap for ConcurrentMap
45 #include <gtsam/base/FastMap.h>
46 template <typename KEY, typename VALUE>
48 
49 #endif
50 
51 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION
52 #include <boost/serialization/nvp.hpp>
53 #include <boost/serialization/split_member.hpp>
54 #endif
55 
56 #include <gtsam/base/FastVector.h>
57 
58 namespace gtsam {
59 
68 template<typename KEY, typename VALUE>
69 class ConcurrentMap : public ConcurrentMapBase<KEY,VALUE> {
70 
71 public:
72 
74 
77 
79  template<typename INPUTITERATOR>
80  ConcurrentMap(INPUTITERATOR first, INPUTITERATOR last) : Base(first, last) {}
81 
83  ConcurrentMap(const ConcurrentMap<KEY,VALUE>& x) : Base(x) {}
84 
86  ConcurrentMap(const Base& x) : Base(x) {}
87 
89  bool exists(const KEY& e) const { return this->count(e); }
90 
91 #ifndef GTSAM_USE_TBB
92  // If we're not using TBB and this is actually a FastMap, we need to add these functions and hide
93  // the original erase functions.
94  void unsafe_erase(typename Base::iterator position) { ((Base*)this)->erase(position); }
95  typename Base::size_type unsafe_erase(const KEY& k) { return ((Base*)this)->erase(k); }
96  void unsafe_erase(typename Base::iterator first, typename Base::iterator last) {
97  return ((Base*)this)->erase(first, last); }
98 private:
99  void erase() {}
100 public:
101 #endif
102 
103 private:
104 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION
105 
106  friend class boost::serialization::access;
107  template<class Archive>
108  void save(Archive& ar, const unsigned int /*version*/) const
109  {
110  // Copy to an STL container and serialize that
111  FastVector<std::pair<KEY, VALUE> > map(this->size());
112  std::copy(this->begin(), this->end(), map.begin());
113  ar & BOOST_SERIALIZATION_NVP(map);
114  }
115  template<class Archive>
116  void load(Archive& ar, const unsigned int /*version*/)
117  {
118  this->clear();
119  // Load into STL container and then fill our map
121  ar & BOOST_SERIALIZATION_NVP(map);
122  this->insert(map.begin(), map.end());
123  }
124  BOOST_SERIALIZATION_SPLIT_MEMBER()
125 #endif
126 };
127 
128 }
std::vector< T, typename internal::FastDefaultVectorAllocator< T >::type > FastVector
Definition: FastVector.h:34
ConcurrentMap(const ConcurrentMap< KEY, VALUE > &x)
Definition: ConcurrentMap.h:83
bool exists(const KEY &e) const
Definition: ConcurrentMap.h:89
ConcurrentMap(const Base &x)
Definition: ConcurrentMap.h:86
Included from all GTSAM files.
ConcurrentMap(INPUTITERATOR first, INPUTITERATOR last)
Definition: ConcurrentMap.h:80
Definition: FastMap.h:39
GTSAM_EXPORT void save(const Matrix &A, const std::string &s, const std::string &filename)
A thin wrapper around std::vector that uses a custom allocator.
Definition: chartTesting.h:28
A thin wrapper around std::map that uses boost&#39;s fast_pool_allocator.
Definition: ConcurrentMap.h:69
ConcurrentMap()
Definition: ConcurrentMap.h:76