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->elided();
99 return handle->empty();
108 return handle->isIndexed();
117 return handle->loaded(timeout);
126 return handle->loaded(timeout);
145 boost::signals2::connection conn =
myLoadedSignal->connect(LoadedCounter(cb));
149 return boost::bind(&boost::signals2::connection::disconnect, conn);
162 handle->forEachFeatureParallel(func);
167 typedef CallbackRecord<ForEachFunction> Record;
168 typedef typename Record::Ptr RecordPtr;
175 detacher = handle->forEachFeatureAsync(func);
181 RecordPtr newHead(Record::Make(func,
myHead, detacher));
182 const_cast<RecordPtr&
>(
myHead) = newHead;
183 return typename Record::Detacher(newHead);
196 const boost::optional<DtFeatureGeometry>& geometry,
201 return Wrap(handle->filter(query, geometry, load));
205 DtTHROW_NEW(
DtException,
"filtered empty feature set wrapper");
219 template <
typename Function>
224 typedef boost::shared_ptr<CallbackRecord>
Ptr;
225 typedef boost::weak_ptr<CallbackRecord>
WPtr;
232 boost::shared_ptr<CallbackRecord> callback(
callbackWptr.lock());
237 explicit Detacher(
const boost::shared_ptr<CallbackRecord>& rec)
248 Mutex::scoped_lock lock(newRec->next->mutex);
249 if (newRec->next->func)
252 newRec->next = newRec->next->next;
262 Mutex::scoped_lock lock(
mutex);
294 ne->addCallbacksTo(fs);
312 Mutex::scoped_lock lock(
mutex);
331 lock.acquire(pr->mutex);
336 pr = pr->prev.lock();
341 Mutex::scoped_lock endLock(ne->mutex);
367 const Function&
func,
391 myHead->addCallbacksTo(fs);
408 typedef boost::signals2::signal_type<
410 boost::signals2::keywords::mutex_type<tbb::spin_mutex> >::type
LoadedSignal;
414 boost::weak_ptr<LoadedSignal>
sig;
420 boost::shared_ptr<LoadedSignal>
signal(
sig.lock());
434 template <
typename>
class PtrTemplate,
438 template <
typename FS,
typename Inner>
452 template <
typename OtherFS>
454 : mySet(fs.release())
460 const Inner*
getPtr()
const {
return mySet.get(); }
462 std::string label()
const
464 return mySet->label();
467 unsigned numberOfFeatures()
const
469 return mySet->numberOfFeatures();
474 return mySet->elided();
479 return mySet->empty();
482 bool isIndexed()
const
484 return mySet->isIndexed();
487 bool loaded(
double timeout=0.0)
const
489 return mySet->loaded(timeout);
494 return mySet->addLoadedCallback(cb);
499 mySet->forEachFeatureParallel(func);
504 return mySet->forEachFeatureAsync(func);
509 const boost::optional<DtFeatureGeometry>& geometry,
512 return Wrap(mySet->filter(query, geometry, load));
517 return Wrap(mySet->clone());
521 const boost::scoped_ptr<Inner>
mySet;
524 template <
typename FS,
typename Inner>
527 DtFeatureSetWrapper<FS,boost::shared_ptr,Inner>,
539 setPtr(boost::shared_ptr<Inner>(fs));
542 template <
typename OtherFS>
546 setPtr(boost::shared_ptr<Inner>(fs.release()));
549 template <
typename OtherFS>
556 boost::shared_ptr<Inner> getPtr()
558 Mutex::scoped_lock lock(myMutex,
false);
562 boost::shared_ptr<const Inner> getPtr()
const
564 Mutex::scoped_lock lock(myMutex,
false);
568 boost::shared_ptr<Inner> setPtr(
const boost::shared_ptr<Inner>& p)
570 Mutex::scoped_lock lock(myMutex,
false);
574 if (!lock.upgrade_to_writer() && mySet && p)
579 lock.downgrade_to_reader();
580 this->setupCallbacks(p);
585 boost::shared_ptr<Inner> setPtr(Inner*
set)
587 boost::shared_ptr<Inner> fs(
set);
593 return Wrap(getPtr());
603 template <
typename FS,
typename Inner>
606 DtFeatureSetWrapper<FS,boost::weak_ptr,Inner>,
618 template <
typename T>
624 template <
typename T>
631 boost::shared_ptr<Inner> getPtr()
633 Mutex::scoped_lock lock(myMutex,
false);
637 boost::shared_ptr<const Inner> getPtr()
const
639 Mutex::scoped_lock lock(myMutex,
false);
643 boost::shared_ptr<Inner> getMutablePtr()
const
648 boost::shared_ptr<Inner> setPtr(
const boost::shared_ptr<Inner>& p)
650 Mutex::scoped_lock lock(myMutex,
false);
653 boost::shared_ptr<Inner> s(mySet.lock());
658 if (!lock.upgrade_to_writer() && p)
660 boost::shared_ptr<Inner> s(mySet.lock());
667 lock.downgrade_to_reader();
668 this->setupCallbacks(p);
675 Mutex::scoped_lock lock(myMutex,
false);