VR-Forces 5.0.1 Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
geometryDuplicateRemover.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2013 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 
9 
11 
12 #include <boost/unordered/unordered_set.hpp>
13 #include <boost/tuple/tuple.hpp>
14 
15 #include <tbb/spin_mutex.h>
16 
17 #include <vrfutil/objectCounter.h>
18 
19 #pragma once
20 
22 namespace MAKVRinTerra
23 {
25 #ifdef DtObjectDebugger_Enable
26  : public DtObjectDebugger<DtGeometryDuplicateRemover>
27 #endif
28  {
29  public:
30  typedef boost::unordered_set<DtFeatureGeometry::Hash> HashSet;
31 
32  bool has(const DtFeatureGeometry& g) const
33  {
34  Mutex::scoped_lock lock(myMutex);
35  return myHashSet.find(g.hash()) != myHashSet.end();
36  }
37 
38  bool insert(const DtFeatureGeometry& g)
39  {
40  return insert(g.hash());
41  }
42 
43  bool insert(const std::string& h)
44  {
45  HashSet::iterator iter;
46  bool inserted;
47 
48  Mutex::scoped_lock lock(myMutex);
49  boost::tie(iter, inserted) = myHashSet.insert(h);
50 
51  return inserted;
52  }
53 
54  protected:
55  typedef tbb::spin_mutex Mutex;
56  mutable Mutex myMutex;
57 
59  };
60 
61  template <typename F>
63  {
64  public:
65  typedef boost::function<void (const F&)> ForEachFunction;
66 
68 
70  : myFunc(func)
71  {
72  assert(myFunc);
73  }
74 
75  bool isDuplicate(const F& feature)
76  {
77  boost::optional<std::string> attr = feature.template attributeAs<std::string>("MAK_FID");
78 
79  if (attr)
80  {
81  if (attr->empty())
82  return false;
83 
84  return !insert(*attr);
85  }
86 
87  return !insert(feature.geometry());
88  }
89 
90  void operator()(const F& feature) const
91  {
92  if (!const_cast<DtFeatureDuplicateRemover*>(this)->isDuplicate(feature))
93  myFunc(feature);
94  }
95 
96  void call(ForEachFunction func, const F& feature)
97  {
98  if (!isDuplicate(feature))
99  func(feature);
100  }
101 
102  protected:
104  };
105 
106  template <typename F>
108 #ifdef DtObjectDebugger_Enable
109  : public DtObjectDebugger< DtSharedFeatureDuplicateRemover<F> >
110 #endif
111  {
112  public:
113  typedef boost::function<void (const F&)> ForEachFunction;
114 
115  typedef boost::shared_ptr<DtFeatureDuplicateRemover<F> > BasePtr;
116 
119  {
120  }
121 
122  bool isDuplicate(const F& feature)
123  {
124  return myRemover->isDuplicate(feature);
125  }
126 
127  void operator()(const F& feature) const
128  {
129  (*myRemover)(feature);
130  }
131 
132  void call(ForEachFunction func, const F& feature) const
133  {
134  myRemover->call(func, feature);
135  }
136 
138  : myRemover(r)
139  {
140  assert(myRemover);
141  }
142 
143  private:
145  };
146 
147  template <typename FS>
149  : public FS::ScopedWrapper
150 #ifdef DtObjectDebugger_Enable
151  , public DtObjectDebugger< DtDeduplicatingFeatureSet<FS> >
152 #endif
153  {
154  public:
155  typedef typename FS::ScopedWrapper Parent;
156  typedef typename FS::Feature Feature;
157  typedef typename FS::ForEachFunction ForEachFunction;
158 
159  explicit DtDeduplicatingFeatureSet(FS* fs)
160  : Parent(fs)
161  {
162  }
163 
164  void forEachFeatureParallel(const ForEachFunction& func) const
165  {
167  Parent::forEachFeatureParallel(std::ref(dedupe));
168  }
169 
170  typename FS::DetachCallback forEachFeatureAsync(const ForEachFunction& func) const
171  {
176  return Parent::forEachFeatureAsync(func);
177  }
178 
179  FS* filter(
180  const DtQuery& query,
181  const boost::optional<DtFeatureGeometry>& geom,
182  DtLoadType load) const
183  {
184  std::auto_ptr<FS> fs(Parent::filter(query, geom, load));
185  if (!fs.get())
186  return 0;
187 
188  return new DtDeduplicatingFeatureSet(fs.release());
189  }
190 
192  {
193  return new DtDeduplicatingFeatureSet(*this);
194  }
195 
196  protected:
198  : Parent(fs.getPtr()->clone())
199  {
200  }
201  };
202 }
203 
#define DT_DLL_features
stop complaining about multiple independent base classes for boost::noncopyable this should probably ...
Definition: featuresDefines.h:41
Mutex myMutex
Definition: geometryDuplicateRemover.h:56
FS::Feature Feature
Definition: geometryDuplicateRemover.h:156
FS::DetachCallback forEachFeatureAsync(const ForEachFunction &func) const
Definition: geometryDuplicateRemover.h:170
void call(ForEachFunction func, const F &feature)
Definition: geometryDuplicateRemover.h:96
FS::ScopedWrapper Parent
Definition: geometryDuplicateRemover.h:155
bool insert(const DtFeatureGeometry &g)
Definition: geometryDuplicateRemover.h:38
#define DT_DEFINE_OBJECT_DEBUGGER_NAME(type)
Definition: objectCounter.h:265
Default on in debug, off in release.
Definition: objectCounter.h:31
DtDeduplicatingFeatureSet(FS *fs)
Definition: geometryDuplicateRemover.h:159
ForEachFunction myFunc
Definition: geometryDuplicateRemover.h:103
DtFeatureDuplicateRemover(const ForEachFunction &func)
Definition: geometryDuplicateRemover.h:69
bool isDuplicate(const F &feature)
Definition: geometryDuplicateRemover.h:75
DtDeduplicatingFeatureSet(const DtDeduplicatingFeatureSet &fs)
Definition: geometryDuplicateRemover.h:197
DtFeatureDuplicateRemover()
Definition: geometryDuplicateRemover.h:67
boost::function< void(const F &)> ForEachFunction
Definition: geometryDuplicateRemover.h:65
void operator()(const F &feature) const
Definition: geometryDuplicateRemover.h:127
bool isDuplicate(const F &feature)
Definition: geometryDuplicateRemover.h:122
Represents a set of characeters a DtFeature object can have. DtQuery objects are the way to communica...
Definition: query.h:38
DtSharedFeatureDuplicateRemover(const ForEachFunction &func)
Definition: geometryDuplicateRemover.h:117
Definition: geometryDuplicateRemover.h:148
HashSet myHashSet
Definition: geometryDuplicateRemover.h:58
#define DT_DEFINE_OBJECT_DEBUGGER_NAME_TEMPLATE(type)
Definition: objectCounter.h:275
FS::ForEachFunction ForEachFunction
Definition: geometryDuplicateRemover.h:157
Definition: geometryDuplicateRemover.h:107
boost::shared_ptr< DtFeatureDuplicateRemover< F > > BasePtr
Definition: geometryDuplicateRemover.h:115
FS * filter(const DtQuery &query, const boost::optional< DtFeatureGeometry > &geom, DtLoadType load) const
Definition: geometryDuplicateRemover.h:179
boost::unordered_set< DtFeatureGeometry::Hash > HashSet
Definition: geometryDuplicateRemover.h:30
DtLoadType
Used to indicate whether to load features. See DtFeatureSetTemplate::filter.
Definition: featureSet.h:36
void call(ForEachFunction func, const F &feature) const
Definition: geometryDuplicateRemover.h:132
DtSharedFeatureDuplicateRemover(const BasePtr &r)
Definition: geometryDuplicateRemover.h:137
tbb::spin_mutex Mutex
Definition: geometryDuplicateRemover.h:55
BasePtr myRemover
Definition: geometryDuplicateRemover.h:144
void forEachFeatureParallel(const ForEachFunction &func) const
Definition: geometryDuplicateRemover.h:164
bool has(const DtFeatureGeometry &g) const
Definition: geometryDuplicateRemover.h:32
bool insert(const std::string &h)
Definition: geometryDuplicateRemover.h:43
Definition: geometryDuplicateRemover.h:62
void operator()(const F &feature) const
Definition: geometryDuplicateRemover.h:90
DtDeduplicatingFeatureSet * clone() const
Definition: geometryDuplicateRemover.h:191
boost::function< void(const F &)> ForEachFunction
Definition: geometryDuplicateRemover.h:113
Definition: geometryDuplicateRemover.h:24
Represents a feature geometry.
Definition: featureGeometry.h:39
Hash hash() const
Get hash which uniquely identifies this geometry, caches result.

Document ID: Generated on Mon Jun 20 00:38:30 EDT 2022 from SVN revision 244029
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)