17 #include <boost/scoped_ptr.hpp>
18 #include <boost/shared_ptr.hpp>
19 #include <boost/weak_ptr.hpp>
20 #include <boost/foreach.hpp>
21 #include <boost/signals2.hpp>
23 #include <tbb/spin_mutex.h>
24 #include <tbb/spin_rw_mutex.h>
25 #include <tbb/null_rw_mutex.h>
36 namespace MAKVRinTerra
46 Derived*
This() {
return static_cast<Derived*
>(
this); }
47 const Derived*
This()
const {
return static_cast<const Derived*
>(
this); }
56 typedef typename FeatureSet::Feature
Feature;
61 typedef boost::shared_ptr<Inner>
Ptr;
62 typedef boost::shared_ptr<const Inner>
CPtr;
64 template <
typename Function=ForEachFunction>
71 return handle->label();
73 return "empty feature set wrapper";
81 return handle->numberOfFeatures();
90 return handle->empty();
99 return handle->isIndexed();
108 return handle->loaded(timeout);
117 return handle->loaded(timeout);
140 return boost::bind(&boost::signals2::connection::disconnect, conn);
153 handle->forEachFeatureParallel(func);
158 typedef CallbackRecord<ForEachFunction> Record;
159 typedef typename Record::Ptr RecordPtr;
166 detacher = handle->forEachFeatureAsync(func);
172 RecordPtr newHead(Record::Make(func,
myHead, detacher));
173 const_cast<RecordPtr&
>(
myHead) = newHead;
174 return typename Record::Detacher(newHead);
187 const boost::optional<DtFeatureGeometry>& geometry,
192 return Wrap(handle->filter(query, geometry, load));
196 DtTHROW_NEW(
DtException,
"filtered empty feature set wrapper");
210 template <
typename Function>
215 typedef boost::shared_ptr<CallbackRecord>
Ptr;
216 typedef boost::weak_ptr<CallbackRecord>
WPtr;
223 boost::shared_ptr<CallbackRecord> callback(
callbackWptr.lock());
228 explicit Detacher(
const boost::shared_ptr<CallbackRecord>& rec)
239 Mutex::scoped_lock lock(newRec->next->mutex);
240 if (newRec->next->func)
243 newRec->next = newRec->next->next;
253 Mutex::scoped_lock lock(
mutex);
285 ne->addCallbacksTo(fs);
303 Mutex::scoped_lock lock(
mutex);
322 lock.acquire(pr->mutex);
327 pr = pr->prev.lock();
332 Mutex::scoped_lock endLock(ne->mutex);
358 const Function&
func,
382 myHead->addCallbacksTo(fs);
403 boost::weak_ptr<LoadedSignal>
sig;
409 boost::shared_ptr<LoadedSignal>
signal(
sig.lock());
423 template <
typename>
class PtrTemplate,
427 template <
typename FS,
typename Inner>
441 template <
typename OtherFS>
443 : mySet(fs.release())
449 const Inner*
getPtr()
const {
return mySet.get(); }
451 std::string label()
const
453 return mySet->label();
456 unsigned numberOfFeatures()
const
458 return mySet->numberOfFeatures();
463 return mySet->empty();
466 bool isIndexed()
const
468 return mySet->isIndexed();
471 bool loaded(
double timeout=0.0)
const
473 return mySet->loaded(timeout);
478 return mySet->addLoadedCallback(cb);
483 mySet->forEachFeatureParallel(func);
488 return mySet->forEachFeatureAsync(func);
493 const boost::optional<DtFeatureGeometry>& geometry,
496 return Wrap(mySet->filter(query, geometry, load));
501 return Wrap(mySet->clone());
505 const boost::scoped_ptr<Inner>
mySet;
508 template <
typename FS,
typename Inner>
511 DtFeatureSetWrapper<FS,boost::shared_ptr,Inner>,
523 setPtr(boost::shared_ptr<Inner>(fs));
526 template <
typename OtherFS>
530 setPtr(boost::shared_ptr<Inner>(fs.release()));
533 template <
typename OtherFS>
540 boost::shared_ptr<Inner> getPtr()
542 Mutex::scoped_lock lock(myMutex,
false);
546 boost::shared_ptr<const Inner> getPtr()
const
548 Mutex::scoped_lock lock(myMutex,
false);
552 boost::shared_ptr<Inner> setPtr(
const boost::shared_ptr<Inner>& p)
554 Mutex::scoped_lock lock(myMutex,
false);
558 if (!lock.upgrade_to_writer() && mySet && p)
563 lock.downgrade_to_reader();
564 this->setupCallbacks(p);
569 boost::shared_ptr<Inner> setPtr(Inner*
set)
571 boost::shared_ptr<Inner> fs(
set);
577 return Wrap(getPtr());
587 template <
typename FS,
typename Inner>
590 DtFeatureSetWrapper<FS,boost::weak_ptr,Inner>,
602 template <
typename T>
608 template <
typename T>
615 boost::shared_ptr<Inner> getPtr()
617 Mutex::scoped_lock lock(myMutex,
false);
621 boost::shared_ptr<const Inner> getPtr()
const
623 Mutex::scoped_lock lock(myMutex,
false);
627 boost::shared_ptr<Inner> getMutablePtr()
const
632 boost::shared_ptr<Inner> setPtr(
const boost::shared_ptr<Inner>& p)
634 Mutex::scoped_lock lock(myMutex,
false);
637 boost::shared_ptr<Inner> s(mySet.lock());
642 if (!lock.upgrade_to_writer() && p)
644 boost::shared_ptr<Inner> s(mySet.lock());
651 lock.downgrade_to_reader();
652 this->setupCallbacks(p);
659 Mutex::scoped_lock lock(myMutex,
false);