23 #include <boost/optional.hpp>
25 namespace MAKVRinTerra
27 template <
typename FS,
typename S =
typename FS::Sink>
30 ,
public std::enable_shared_from_this<DtAttributeIndexingFeatureSet<FS,S> >
36 typedef std::shared_ptr<DtAttributeIndexingFeatureSet>
Ptr;
37 typedef std::shared_ptr<const DtAttributeIndexingFeatureSet>
CPtr;
38 typedef std::weak_ptr<DtAttributeIndexingFeatureSet>
WPtr;
54 typedef std::shared_ptr<Config>
Ptr;
81 if (lower.empty()) lower =
" ";
82 if (upper.empty()) upper =
"~";
92 return FS::Wrap(this->shared_from_this());
97 return myConfig->inputSink->label() +
" index level "
98 + 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 std::shared_ptr<Config>& cfg,
276 DtTHROW_NEW(
DtException,
"Tile index out of bounds");
282 Ptr This(this->shared_from_this());
293 auto expected =
START;
299 Ptr This(this->shared_from_this());
312 DtWarn <<
"Error activating subtile" << std::endl;
340 while (!s1.empty() && !s2.empty() && s1[0] == s2[0])
342 prefix.push_back(s1[0]);
352 static std::string
findMiddle(
const std::string& lower,
const std::string& upper)
356 string s1=lower, s2=upper;
359 char c1 = s1.empty() ?
' ' : s1[0];
360 char c2 = s2.empty() ?
'~' : s2[0];
367 ret = prefix + c1 +
"z";
371 int middle = (c1+c2)/2;
372 ret = prefix +
static_cast<char>(middle);
375 assert(lower <= ret);
407 const Sink& parentFeatures,
411 : myLowerBound(i == 0 ? plower :
findMiddle(plower, pupper))
413 , myUpperBound(i == 1 ? pupper :
findMiddle(plower, pupper))
415 , myQuery(myLowerBoundQuery && myUpperBoundQuery)
418 DtWarn <<
"Level " << i <<
": " << plower
420 <<
" query " <<
query()
426 Caller caller(parent, *
this);
427 mySink->addLoadedCallback(caller);
435 myIndexingSet->init();
443 if (!mySink->loaded())
455 size_t c = mySink->numberOfFeatures();
460 if (pc <= parent.myConfig->minFeaturesToIndexTile)
481 : set(set), subtile(subtile)
Definition: attributeIndexingFeatureSet.h:126
const Bound & lowerBound() const
Definition: attributeIndexingFeatureSet.h:402
Config(const SinkPtr &input, const DtFeature::Key &key)
Definition: attributeIndexingFeatureSet.h:58
Definition: attributeIndexingFeatureSet.h:505
Class DtTerrainInterfaceConfig is a readable-writable class holding terrain interface configuration o...
Definition: terrainInterfaceConfig.h:33
const std::shared_ptr< Config > myConfig
Configuration data for this node.
Definition: attributeIndexingFeatureSet.h:321
bool elided() const
Definition: attributeIndexingFeatureSet.h:116
DtQuery myQuery
Definition: attributeIndexingFeatureSet.h:394
S Sink
Definition: attributeIndexingFeatureSet.h:45
static std::string removePrefix(std::string &s1, std::string &s2)
Definition: attributeIndexingFeatureSet.h:335
FS * clone() const
Definition: attributeIndexingFeatureSet.h:90
Set of subtiles.
Definition: attributeIndexingFeatureSet.h:333
const SinkPtr inputSink
Definition: attributeIndexingFeatureSet.h:68
Key used to lookup attributes. The DtFeature interface is a dictionary that maps Key objects to attri...
Definition: feature.h:67
Definition: attributeIndexingFeatureSet.h:505
Bound myLowerBound
Definition: attributeIndexingFeatureSet.h:390
DtAttributeIndexingFeatureSet(const Ptr &parent, const Subtile &subtile)
Definition: attributeIndexingFeatureSet.h:244
bool isTrue() const
Definition: query.h:113
std::string Bound
Definition: attributeIndexingFeatureSet.h:48
std::shared_ptr< Config > Ptr
Definition: attributeIndexingFeatureSet.h:54
DtAttributeIndexingFeatureSet(const std::shared_ptr< Config > &cfg, const Bound &lower, const Bound &upper)
Definition: attributeIndexingFeatureSet.h:255
bool empty() const
Definition: attributeIndexingFeatureSet.h:121
const int myLevel
Level in hierarchy.
Definition: attributeIndexingFeatureSet.h:324
FS::ForEachFunction ForEachFunction
Definition: attributeIndexingFeatureSet.h:41
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:330
DtQuery myLowerBoundQuery
Definition: attributeIndexingFeatureSet.h:391
Do not initiate new loads, read whatever is currently loaded.
Definition: featureSet.h:42
const Subtile & subtile
Definition: attributeIndexingFeatureSet.h:163
const DtHasAttributeValue & upperBoundQuery() const
Definition: attributeIndexingFeatureSet.h:400
FS::DetachCallback DetachCallback
Definition: attributeIndexingFeatureSet.h:43
FS::Feature Feature
Definition: attributeIndexingFeatureSet.h:40
Matches features that have an attribute with a certain key.
Definition: query.h:294
const Bound & upperBound() const
Definition: attributeIndexingFeatureSet.h:401
std::string label() const
Definition: attributeIndexingFeatureSet.h:95
Sink::Ptr SinkPtr
Definition: attributeIndexingFeatureSet.h:46
static FS * Make(const typename Config::Ptr &cfg, Bound lower=Bound(), Bound upper=Bound())
Definition: attributeIndexingFeatureSet.h:77
bool isFalse() const
Definition: query.h:114
Subtile mySubtile1
Definition: attributeIndexingFeatureSet.h:501
const Subtile & getSubtile(unsigned i) const
Definition: attributeIndexingFeatureSet.h:267
Caller(const Ptr &set, Subtile &subtile)
Definition: attributeIndexingFeatureSet.h:480
static DtQuery Merge(const DtHasAttributeValue &, const DtHasAttributeValue &)
Config(const Config &cfg)
Definition: attributeIndexingFeatureSet.h:61
Subtile & subtile
Definition: attributeIndexingFeatureSet.h:494
void checkIndex(DtAttributeIndexingFeatureSet &parent)
Definition: attributeIndexingFeatureSet.h:439
Configuration information.
Definition: attributeIndexingFeatureSet.h:51
FS::LoadedCallback LoadedCallback
Definition: attributeIndexingFeatureSet.h:42
static std::string findMiddle(const std::string &lower, const std::string &upper)
Definition: attributeIndexingFeatureSet.h:352
std::shared_ptr< const DtAttributeIndexingFeatureSet > CPtr
Definition: attributeIndexingFeatureSet.h:37
std::weak_ptr< DtAttributeIndexingFeatureSet > WPtr
Definition: attributeIndexingFeatureSet.h:38
std::shared_ptr< DtAttributeIndexingFeatureSet > Ptr
Definition: attributeIndexingFeatureSet.h:33
bool loaded(double timeout) const
Definition: attributeIndexingFeatureSet.h:101
virtual DtQuery visit(const DtQuery &query) override
Definition: attributeIndexingFeatureSet.h:135
Represents a set of characeters a DtFeature object can have. DtQuery objects are the way to communica...
Definition: query.h:37
Bound myUpperBound
Definition: attributeIndexingFeatureSet.h:392
void init(const Ptr &parent)
Definition: attributeIndexingFeatureSet.h:424
WPtr set
Definition: attributeIndexingFeatureSet.h:493
Subtile(const Sink &parentFeatures, const DtFeature::Key &indexKey, const Bound &plower, const Bound &pupper, unsigned i)
Definition: attributeIndexingFeatureSet.h:406
DtQuery myUpperBoundQuery
Definition: attributeIndexingFeatureSet.h:393
SinkPtr mySink
Definition: attributeIndexingFeatureSet.h:395
unsigned numberOfFeatures() const
Definition: attributeIndexingFeatureSet.h:111
static FS * Make(Config *cfg, const Bound &lower=Bound(), const Bound &upper=Bound())
Definition: attributeIndexingFeatureSet.h:72
State
Definition: attributeIndexingFeatureSet.h:503
Definition: attributeIndexingFeatureSet.h:28
const SinkPtr & sink() const
Definition: attributeIndexingFeatureSet.h:403
bool activateSubtiles()
Mark subtiles and read to use.
Definition: attributeIndexingFeatureSet.h:289
std::shared_ptr< DtAttributeIndexingFeatureSet > myIndexingSet
Definition: attributeIndexingFeatureSet.h:389
void forEachFeatureParallel(const ForEachFunction &func) const
Definition: attributeIndexingFeatureSet.h:233
QueryVisitor(const DtFeature::Key &key, const Subtile &subtile)
Definition: attributeIndexingFeatureSet.h:129
const DtHasAttributeValue & lowerBoundQuery() const
Definition: attributeIndexingFeatureSet.h:399
DtLoadType
Used to indicate whether to load features. See DtFeatureSetTemplate::filter.
Definition: featureSet.h:33
DtFeature::Key attribute
Definition: attributeIndexingFeatureSet.h:162
const FS & indexedFeatures() const
Definition: attributeIndexingFeatureSet.h:404
Definition: attributeIndexingFeatureSet.h:505
DetachCallback forEachFeatureAsync(const ForEachFunction &func) const
Definition: attributeIndexingFeatureSet.h:238
Definition: featureSet.h:66
DtFeatureSet used to combine multiple feature sets into one. This class allows all feature set algori...
Definition: featureSetList.h:26
Definition: attributeIndexingFeatureSet.h:505
virtual Result apply(const DtQuery &query)
Definition: query.h:153
DetachCallback addLoadedCallback(const LoadedCallback &cb) const
Definition: attributeIndexingFeatureSet.h:106
const WPtr myParent
Weak pointer to parent node.
Definition: attributeIndexingFeatureSet.h:327
static DtQuery makeQuery(const DtFeature::Key &indexKey, const Bound &bound, DtHasAttributeValue::Comparison comp)
Definition: attributeIndexingFeatureSet.h:382
const DtFeature::Key indexKey
Definition: attributeIndexingFeatureSet.h:69
const DtQuery & query() const
Definition: attributeIndexingFeatureSet.h:398
static DtQuery Create(DtFeature::Key, DtFeature::Attribute, Comparison)
Comparison
Definition: query.h:324
const T * trycast() const
Definition: query.h:99
Subtile mySubtile0
Definition: attributeIndexingFeatureSet.h:500
void init()
Delayed init needed b/c we need a shared_ptr to ourself.
Definition: attributeIndexingFeatureSet.h:280
std::atomic< State > myState
Definition: attributeIndexingFeatureSet.h:508
Definition: attributeIndexingFeatureSet.h:477
void operator()() const
Definition: attributeIndexingFeatureSet.h:485
Config(FS *input, const DtFeature::Key &key)
Definition: attributeIndexingFeatureSet.h:56
void activate(const Ptr &parent)
Definition: attributeIndexingFeatureSet.h:432