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)