21 #include <tbb/atomic.h>
23 #include <boost/optional.hpp>
24 #include <boost/shared_ptr.hpp>
26 namespace MAKVRinTerra
28 template <
typename FS,
typename S =
typename FS::Sink>
31 ,
public boost::enable_shared_from_this<DtAttributeIndexingFeatureSet<FS,S> >
37 typedef boost::shared_ptr<DtAttributeIndexingFeatureSet>
Ptr;
38 typedef boost::shared_ptr<const DtAttributeIndexingFeatureSet>
CPtr;
39 typedef boost::weak_ptr<DtAttributeIndexingFeatureSet>
WPtr;
55 typedef boost::shared_ptr<Config>
Ptr;
82 if (lower.empty()) lower =
" ";
83 if (upper.empty()) upper =
"~";
93 return FS::Wrap(this->shared_from_this());
98 return myConfig->inputSink->label() +
" index level "
99 + boost::lexical_cast<std::string>(
myLevel);
168 const boost::optional<DtFeatureGeometry>& geometry,
172 return new typename FS::Filtered(FS::Wrap(this->shared_from_this()), query, geometry);
176 return myFeatures->filter(
true, geometry, load);
180 return myFeatures->filter(query, geometry, load);
182 bool covers[2] = {
false,
false };
183 bool intersections[2] = {
false,
false };
184 size_t lastIntersection = 0;
185 unsigned numIntersects = 0;
189 for (
unsigned i=0 ; i < 2; ++i)
193 if (processed.isFalse())
196 intersections[i] =
true;
197 lastIntersection = i;
206 switch (numIntersects)
210 !covers[lastIntersection] ? query :
true,
218 for (
size_t i=0; i != 4; ++i)
220 if (!intersections[i])
224 !covers[i] ? query :
true,
230 return list.release();
256 const boost::shared_ptr<Config>& cfg,
276 DtTHROW_NEW(
DtException,
"Tile index out of bounds");
282 Ptr This(this->shared_from_this());
298 Ptr This(this->shared_from_this());
310 DtWarn <<
"Error activating subtile" << std::endl;
338 while (!s1.empty() && !s2.empty() && s1[0] == s2[0])
340 prefix.push_back(s1[0]);
350 static std::string
findMiddle(
const std::string& lower,
const std::string& upper)
354 string s1=lower, s2=upper;
357 char c1 = s1.empty() ?
' ' : s1[0];
358 char c2 = s2.empty() ?
'~' : s2[0];
365 ret = prefix + c1 +
"z";
369 int middle = (c1+c2)/2;
370 ret = prefix +
static_cast<char>(middle);
373 assert(lower <= ret);
405 const Sink& parentFeatures,
409 : myLowerBound(i == 0 ? plower :
findMiddle(plower, pupper))
411 , myUpperBound(i == 1 ? pupper :
findMiddle(plower, pupper))
413 , myQuery(myLowerBoundQuery && myUpperBoundQuery)
416 DtWarn <<
"Level " << i <<
": " << plower
418 <<
" query " <<
query()
424 Caller caller(parent, *
this);
425 mySink->addLoadedCallback(caller);
433 myIndexingSet->init();
441 if (!mySink->loaded())
453 size_t c = mySink->numberOfFeatures();
458 if (pc <= parent.myConfig->minFeaturesToIndexTile)
479 : set(set), subtile(subtile)
Definition: attributeIndexingFeatureSet.h:127
const Bound & lowerBound() const
Definition: attributeIndexingFeatureSet.h:400
Config(const SinkPtr &input, const DtFeature::Key &key)
Definition: attributeIndexingFeatureSet.h:59
Definition: attributeIndexingFeatureSet.h:503
Class DtTerrainInterfaceConfig is a readable-writable class holding terrain interface configuration o...
Definition: terrainInterfaceConfig.h:32
bool elided() const
Definition: attributeIndexingFeatureSet.h:117
DtQuery myQuery
Definition: attributeIndexingFeatureSet.h:392
boost::shared_ptr< DtAttributeIndexingFeatureSet > Ptr
Definition: attributeIndexingFeatureSet.h:34
S Sink
Definition: attributeIndexingFeatureSet.h:46
static std::string removePrefix(std::string &s1, std::string &s2)
Definition: attributeIndexingFeatureSet.h:333
FS * clone() const
Definition: attributeIndexingFeatureSet.h:91
Set of subtiles.
Definition: attributeIndexingFeatureSet.h:331
const SinkPtr inputSink
Definition: attributeIndexingFeatureSet.h:69
Key used to lookup attributes. The DtFeature interface is a dictionary that maps Key objects to attri...
Definition: feature.h:68
Definition: attributeIndexingFeatureSet.h:503
Bound myLowerBound
Definition: attributeIndexingFeatureSet.h:388
DtQuery visit(const DtQuery &query)
Definition: attributeIndexingFeatureSet.h:135
DtAttributeIndexingFeatureSet(const Ptr &parent, const Subtile &subtile)
Definition: attributeIndexingFeatureSet.h:244
bool isTrue() const
Definition: query.h:114
std::string Bound
Definition: attributeIndexingFeatureSet.h:49
bool empty() const
Definition: attributeIndexingFeatureSet.h:122
const int myLevel
Level in hierarchy.
Definition: attributeIndexingFeatureSet.h:322
FS::ForEachFunction ForEachFunction
Definition: attributeIndexingFeatureSet.h:42
FS * filter(const DtQuery &query, const boost::optional< DtFeatureGeometry > &geometry, DtLoadType load) const
Definition: attributeIndexingFeatureSet.h:166
SinkPtr myFeatures
Features in this tile.
Definition: attributeIndexingFeatureSet.h:328
DtQuery myLowerBoundQuery
Definition: attributeIndexingFeatureSet.h:389
Do not initiate new loads, read whatever is currently loaded.
Definition: featureSet.h:45
const Subtile & subtile
Definition: attributeIndexingFeatureSet.h:163
const DtHasAttributeValue & upperBoundQuery() const
Definition: attributeIndexingFeatureSet.h:398
FS::DetachCallback DetachCallback
Definition: attributeIndexingFeatureSet.h:44
boost::shared_ptr< DtAttributeIndexingFeatureSet > myIndexingSet
Definition: attributeIndexingFeatureSet.h:387
FS::Feature Feature
Definition: attributeIndexingFeatureSet.h:41
Matches features that have an attribute with a certain key.
Definition: query.h:295
const Bound & upperBound() const
Definition: attributeIndexingFeatureSet.h:399
std::string label() const
Definition: attributeIndexingFeatureSet.h:96
Sink::Ptr SinkPtr
Definition: attributeIndexingFeatureSet.h:47
static FS * Make(const typename Config::Ptr &cfg, Bound lower=Bound(), Bound upper=Bound())
Definition: attributeIndexingFeatureSet.h:78
bool isFalse() const
Definition: query.h:115
Subtile mySubtile1
Definition: attributeIndexingFeatureSet.h:499
const Subtile & getSubtile(unsigned i) const
Definition: attributeIndexingFeatureSet.h:267
Caller(const Ptr &set, Subtile &subtile)
Definition: attributeIndexingFeatureSet.h:478
static DtQuery Merge(const DtHasAttributeValue &, const DtHasAttributeValue &)
Config(const Config &cfg)
Definition: attributeIndexingFeatureSet.h:62
Subtile & subtile
Definition: attributeIndexingFeatureSet.h:492
void checkIndex(DtAttributeIndexingFeatureSet &parent)
Definition: attributeIndexingFeatureSet.h:437
Configuration information.
Definition: attributeIndexingFeatureSet.h:52
FS::LoadedCallback LoadedCallback
Definition: attributeIndexingFeatureSet.h:43
static std::string findMiddle(const std::string &lower, const std::string &upper)
Definition: attributeIndexingFeatureSet.h:350
bool loaded(double timeout) const
Definition: attributeIndexingFeatureSet.h:102
Represents a set of characeters a DtFeature object can have. DtQuery objects are the way to communica...
Definition: query.h:38
Bound myUpperBound
Definition: attributeIndexingFeatureSet.h:390
boost::weak_ptr< DtAttributeIndexingFeatureSet > WPtr
Definition: attributeIndexingFeatureSet.h:39
void init(const Ptr &parent)
Definition: attributeIndexingFeatureSet.h:422
WPtr set
Definition: attributeIndexingFeatureSet.h:491
Subtile(const Sink &parentFeatures, const DtFeature::Key &indexKey, const Bound &plower, const Bound &pupper, unsigned i)
Definition: attributeIndexingFeatureSet.h:404
DtQuery myUpperBoundQuery
Definition: attributeIndexingFeatureSet.h:391
SinkPtr mySink
Definition: attributeIndexingFeatureSet.h:393
unsigned numberOfFeatures() const
Definition: attributeIndexingFeatureSet.h:112
static FS * Make(Config *cfg, const Bound &lower=Bound(), const Bound &upper=Bound())
Definition: attributeIndexingFeatureSet.h:73
State
Definition: attributeIndexingFeatureSet.h:501
Definition: attributeIndexingFeatureSet.h:29
const SinkPtr & sink() const
Definition: attributeIndexingFeatureSet.h:401
bool activateSubtiles()
Mark subtiles and read to use.
Definition: attributeIndexingFeatureSet.h:289
void forEachFeatureParallel(const ForEachFunction &func) const
Definition: attributeIndexingFeatureSet.h:233
QueryVisitor(const DtFeature::Key &key, const Subtile &subtile)
Definition: attributeIndexingFeatureSet.h:130
const boost::shared_ptr< Config > myConfig
Configuration data for this node.
Definition: attributeIndexingFeatureSet.h:319
const DtHasAttributeValue & lowerBoundQuery() const
Definition: attributeIndexingFeatureSet.h:397
DtLoadType
Used to indicate whether to load features. See DtFeatureSetTemplate::filter.
Definition: featureSet.h:36
DtFeature::Key attribute
Definition: attributeIndexingFeatureSet.h:162
const FS & indexedFeatures() const
Definition: attributeIndexingFeatureSet.h:402
DtAttributeIndexingFeatureSet(const boost::shared_ptr< Config > &cfg, const Bound &lower, const Bound &upper)
Definition: attributeIndexingFeatureSet.h:255
boost::shared_ptr< const DtAttributeIndexingFeatureSet > CPtr
Definition: attributeIndexingFeatureSet.h:38
Definition: attributeIndexingFeatureSet.h:503
DetachCallback forEachFeatureAsync(const ForEachFunction &func) const
Definition: attributeIndexingFeatureSet.h:238
Definition: featureSet.h:62
DtFeatureSet used to combine multiple feature sets into one. This class allows all feature set algori...
Definition: featureSetList.h:26
Definition: attributeIndexingFeatureSet.h:503
virtual Result apply(const DtQuery &query)
Definition: query.h:154
DetachCallback addLoadedCallback(const LoadedCallback &cb) const
Definition: attributeIndexingFeatureSet.h:107
boost::shared_ptr< Config > Ptr
Definition: attributeIndexingFeatureSet.h:55
tbb::atomic< State > myState
Definition: attributeIndexingFeatureSet.h:506
const WPtr myParent
Weak pointer to parent node.
Definition: attributeIndexingFeatureSet.h:325
static DtQuery makeQuery(const DtFeature::Key &indexKey, const Bound &bound, DtHasAttributeValue::Comparison comp)
Definition: attributeIndexingFeatureSet.h:380
const DtFeature::Key indexKey
Definition: attributeIndexingFeatureSet.h:70
const DtQuery & query() const
Definition: attributeIndexingFeatureSet.h:396
static DtQuery Create(DtFeature::Key, DtFeature::Attribute, Comparison)
Comparison
Definition: query.h:325
const T * trycast() const
Definition: query.h:100
Subtile mySubtile0
Definition: attributeIndexingFeatureSet.h:498
void init()
Delayed init needed b/c we need a shared_ptr to ourself.
Definition: attributeIndexingFeatureSet.h:280
Definition: attributeIndexingFeatureSet.h:475
void operator()() const
Definition: attributeIndexingFeatureSet.h:483
Config(FS *input, const DtFeature::Key &key)
Definition: attributeIndexingFeatureSet.h:57
void activate(const Ptr &parent)
Definition: attributeIndexingFeatureSet.h:430