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

Document ID: Generated on Thu Oct 23 22:29:17 EDT 2025 from SVN revision 280951
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)