 |
threaddb
2.0b
A file mapped memory container extension
|
Go to the documentation of this file.
29 #include <condition_variable>
37 template<
typename T >
60 template<
typename T,
size_t D>
82 const T
x()
const {
return _c[0]; }
83 T&
x() {
return _c[0]; }
85 const T
y()
const {
return _c[1]; }
86 T&
y() {
return _c[1]; }
88 const T
z()
const {
return _c[2]; }
89 T&
z() {
return _c[2]; }
93 for(uint8_t i=0;i<D;++i)
100 for (uint8_t i=0; i < D; ++i)
101 _c[i] -= rhs_p.
_c[i];
109 for (uint8_t i=0; i < D; ++i)
110 os.write((
const char*)&P.
_c[i],
sizeof(P.
_c[i]));
116 for (uint8_t i=0; i < D; ++i)
117 is.read((
char*)&P.
_c[i],
sizeof(P.
_c[i]));
128 template<
class T,
size_t D>
170 template<
typename C,
size_t D>
173 for (uint8_t i=0; i < D; ++i)
185 template<
class T,
typename C,
size_t D,
class L>
188 template<
class T,
typename C,
size_t D,
class L>
198 template<
class T,
typename C,
size_t D>
226 std::atomic<uint16_t>* pTaskCount_p,
227 std::mutex* pThreadMutex_p,
228 std::vector<TaskInfo_*>* pTaskHeap_p)
const;
265 template<
typename C,
size_t D>
272 for (uint8_t i = 0; idx !=-1 && i < D; ++i)
295 return std::make_pair(box, idx);
305 std::pair<tdb::Box<C, 1>, int32_t> index;
311 index.first.min_corner().x() = x;
312 index.first.max_corner().x() = lhs_p.
max_corner().x();
317 index.first.min_corner().x() = lhs_p.
min_corner().x();
318 index.first.max_corner().x() = x;
336 std::pair<tdb::Box<C, 2>, int32_t> index;
342 index.first.min_corner().x() = x;
343 index.first.max_corner().x() = lhs_p.
max_corner().x();
348 index.first.min_corner().x() = lhs_p.
min_corner().x();
349 index.first.max_corner().x() = x;
361 index.first.min_corner().y() = y;
362 index.first.max_corner().y() = lhs_p.
max_corner().y();
366 index.first.min_corner().y() = lhs_p.
min_corner().y();
367 index.first.max_corner().y() = y;
385 std::pair<tdb::Box<C, 3>, int32_t> index;
391 index.first.min_corner().x() = x;
392 index.first.max_corner().x() = lhs_p.
max_corner().x();
397 index.first.min_corner().x() = lhs_p.
min_corner().x();
398 index.first.max_corner().x() = x;
410 index.first.min_corner().y() = y;
411 index.first.max_corner().y() = lhs_p.
max_corner().y();
415 index.first.min_corner().y() = lhs_p.
min_corner().y();
416 index.first.max_corner().y() = y;
428 index.first.min_corner().z() = z;
429 index.first.max_corner().z() = lhs_p.
max_corner().z();
433 index.first.min_corner().z() = lhs_p.
min_corner().z();
434 index.first.max_corner().z() = z;
449 template<
class T,
typename C,
size_t D,
class L>
466 size_t size()
const {
return 1 << D; }
468 std::pair<Box_, int32_t>
index(
const Box_& rBox_p)
const
470 return index_<C,D>(
m_Box, rBox_p);
482 m_Subcells[Idx_p] = std::shared_ptr<L>(
new L(rTile_p, Depth_p, rDb_p));
485 m_Subcells[Idx_p]->add(rBox_p, rData_p, rDb_p);
498 for (
size_t idx=0; idx <= D; ++idx)
502 os.write((
const char*)&idx,
sizeof(idx));
515 for (
size_t idx(0); idx < C_.
m_Subcount; ++idx)
518 is.read((
char*)&cidx,
sizeof(cidx));
519 C_.
m_Subcells[cidx] = std::shared_ptr<L>(
new L());
536 template<
class T,
typename C,
size_t D,
class L>
596 static void loop(
const Box_& rBox_p,
602 std::atomic<uint16_t>* pTaskCount_p,
603 std::mutex* pThreadMutex_p,
604 std::vector<TaskInfo_*>* pTaskHeap_p,
605 bool* pThreadExit_p);
608 std::atomic<uint16_t>* pTaskCount_p,
609 std::mutex* pThreadMutex_p,
610 std::vector<TaskInfo_*>* pTaskHeap_p)
const;
625 template<
class T,
typename C,
size_t D,
class L = Link<T, C, D> >
634 m_pRoot(new L(rBox_p, Depth_p, rDb_p)),
644 is.read((
char*)&m_Depth,
sizeof(m_Depth));
648 void add(
const Box_& rBox_p,
const T& rData_p)
650 m_pRoot->add(rBox_p, rData_p, m_rDatabase);
659 std::mutex threadLock;
660 std::atomic<uint16_t> taskCount(0);
661 bool threadExit(
false);
663 std::vector<std::pair<TaskInfo_, std::shared_ptr<std::thread>>> threadHeap(++Threads_p);
664 std::vector<TaskInfo_*> taskHeap;
665 for (
size_t iter(1); iter < Threads_p; ++iter)
667 TaskInfo_& rTaskInfo(threadHeap[iter].first);
669 threadHeap[iter].second =
671 true, &rTaskInfo, &taskCount, &threadLock, &taskHeap, &threadExit));
672 taskHeap.push_back(&rTaskInfo);
675 TaskInfo_* pTaskInfo = &threadHeap.front().first;
679 while (taskCount != 0)
681 rgrid_<T, C, D, L>::loop(rBox_p, &rCallback_p, &m_rDatabase,
false, pTaskInfo, &taskCount, &threadLock, &taskHeap, &threadExit);
685 for (
size_t iter(1); iter < Threads_p; ++iter)
687 TaskInfo_& rTaskInfo(threadHeap[iter].first);
689 std::lock_guard<std::mutex> lock(rTaskInfo.
m_Mutex);
692 threadHeap[iter].second->join();
698 os.write((
const char*)&R.m_Depth,
sizeof(R.m_Depth));
706 std::shared_ptr<L> m_pRoot;
715 template<
class T,
typename C,
size_t D,
class L>
719 const std::pair<Box<C, D>, int32_t> idx(m_Depth > 0 ? m_Subcells.index(rBox_p) : std::make_pair(m_Subcells.m_Box, int32_t(-1)));
723 size_t dataSize = rData_p.size();
726 dataSize = m_MaxShapeSize.exchange(std::max(m_MaxShapeSize.load(), dataSize));
727 }
while (dataSize > m_MaxShapeSize);
729 rDb_p.
Store(m_PackageID, rData_p.size(), (
const char*)& rData_p);
733 m_Subcells.add(idx.second, idx.first, rBox_p, m_Depth, rData_p, rDb_p);
741 template<
class T,
typename C,
size_t D,
class L>
748 std::atomic<uint16_t>* pTaskCount_p,
749 std::mutex* pThreadMutex_p,
753 bool continueLoop(Continue_p);
756 std::unique_lock<std::mutex> lock(pTaskInfo_p->
m_Mutex);
762 pTaskInfo_p->
m_pNode->recurse(rBox_p, *pCallback_p, (*pDb_p), pTaskCount_p, pThreadMutex_p, pTaskHeap_p);
766 continueLoop =
false;
774 std::lock_guard<std::mutex> lock_(*pThreadMutex_p);
775 (*pTaskHeap_p).push_back(pTaskInfo_p);
778 else if (continueLoop)
780 pTaskInfo_p->
m_Signal.wait_for(lock, std::chrono::milliseconds(10));
783 continueLoop &= (*pThreadExit_p ==
false);
784 }
while (continueLoop);
787 std::unique_lock<std::mutex> lock(pTaskInfo_p->
m_Mutex);
796 template<
class T,
typename C,
size_t D,
class L>
799 std::atomic<uint16_t>* pTaskCount_p,
800 std::mutex* pThreadMutex_p,
805 uint8_t subCells = m_Subcells.m_Subcount;
806 for (uint8_t idx(0); idx < m_Subcells.size(); ++idx)
808 if (m_Subcells.intersects(idx, rBox_p))
810 std::unique_lock<std::mutex> lock(*pThreadMutex_p);
812 if (((*pTaskHeap_p).empty() ==
false) && (subCells > 1))
815 (*pTaskHeap_p).pop_back();
819 std::lock_guard<std::mutex>(pTaskInfo->m_Mutex);
820 pTaskInfo->m_pNode = m_Subcells[idx];
821 pTaskInfo->m_Signal.notify_one();
826 m_Subcells[idx]->recurse(rBox_p, rCallback_p, rDb_p, pTaskCount_p, pThreadMutex_p, pTaskHeap_p);
832 if (m_MaxShapeSize > 0)
835 while (rDb_p.
End(readHandle) ==
false)
837 T* pShape =
new(pBuffer.get())T(rDb_p, readHandle);
839 if (intersects<C, D>((*pShape).bounding_box(), rBox_p))
840 rCallback_p(*pShape);
849 template<
class T,
typename C,
size_t D>
852 m_pRgrid->add(rBox_p, rData_p, rDb_p);
859 template<
class T,
typename C,
size_t D>
862 return tdb::intersects<C, D>(rBox_p, m_pRgrid->bounding_box());
869 template<
class T,
typename C,
size_t D>
871 std::atomic<uint16_t>* pTaskCount_p,
872 std::mutex* pThreadMutex_p,
875 m_pRgrid->recurse(rBox_p, rCallback_p, rDb_p, pTaskCount_p, pThreadMutex_p, pTaskHeap_p);
882 template<
typename C,
size_t D>
892 template<
typename C,
size_t D>
902 template<
typename C,
size_t D>
friend std::ostream & operator<<(std::ostream &os, const Point &P)
Definition: threaddbRGrid.h:107
uint32_t m_Depth
Definition: threaddbRGrid.h:613
std::mutex m_Mutex
Definition: threaddbRGrid.h:257
void add(const Box_ &rBox_p, const T &rData_p, tdb::database &rDb_p)
Routine to add a data element to the rgrid.
Definition: threaddbRGrid.h:850
bool intersects(size_t Idx_p, const Box_ &rBox_p) const
Definition: threaddbRGrid.h:488
const Box_ & bounding_box() const
Definition: threaddbRGrid.h:553
Link(const Box_ &rTile_p, uint32_t Depth_p, tdb::database &rDb_p)
Definition: threaddbRGrid.h:210
Box basic class definition.
Definition: threaddbRGrid.h:129
void operator()(T const *p)
Definition: threaddbRGrid.h:40
C++ wrapper class to the threadDB_ReadInfo control structure.
Definition: threaddbCPP.h:70
Point_ & max_corner()
Definition: threaddbRGrid.h:145
TaskInfo()
Definition: threaddbRGrid.h:254
const T z() const
Definition: threaddbRGrid.h:88
void add(size_t Idx_p, const Box_ &rTile_p, const Box_ &rBox_p, uint32_t Depth_p, const T &rData_p, tdb::database &rDb_p)
Definition: threaddbRGrid.h:476
Box()
Definition: threaddbRGrid.h:133
rgrid_(const Box_ &rBox_p, uint32_t Depth_p, tdb::database &rDb_p)
Definition: threaddbRGrid.h:543
Box< C, D > Box_
Definition: threaddbRGrid.h:452
Definition of a ode of the rgrid.
Definition: threaddbRGrid.h:450
Interface C++ wrapper classes.
T & x()
Definition: threaddbRGrid.h:83
std::pair< Box< C, D >, int32_t > index_(const Box< C, D > &lhs_p, const Box< C, D > &rhs_p)
Range index calculation specialization for n dimensional scenarios.
Definition: threaddbRGrid.h:266
Functor class receiving the queried elements.
Definition: threaddbRGrid.h:51
rgrid_< T, C, D, Link > * m_pRgrid
Definition: threaddbRGrid.h:244
tdb::Box< C, D > & operator+=(tdb::Box< C, D > &a, const tdb::Point< C, D > &b)
Box increment operator.
Definition: threaddbRGrid.h:903
void query(const Box_ &rBox_p, Functor< T > &rCallback_p, tdb::database &rDb_p, uint8_t Threads_p)
Box< C, D > Box_
Definition: threaddbRGrid.h:540
Box< C, D > Box_
Definition: threaddbRGrid.h:201
Point(T x_p, T y_p, T z_p)
Definition: threaddbRGrid.h:75
Query task information.
Definition: threaddbRGrid.h:192
uint64_t m_PackageID
Definition: threaddbRGrid.h:612
~Link()
Definition: threaddbRGrid.h:216
Box< C, D > Box_
Definition: threaddbRGrid.h:629
void query(const Box_ &rBox_p, Functor< T > &rCallback_p, uint8_t Threads_p=0)
Main entry for query operation over multiple threads.
Definition: threaddbRGrid.h:657
TaskInfo< L > TaskInfo_
Definition: threaddbRGrid.h:630
std::shared_ptr< const L > m_pNode
Definition: threaddbRGrid.h:256
Cells< T, C, D, L > m_Subcells
Definition: threaddbRGrid.h:618
void Store(uint64_t Package_p, size_t Size_p, const char pData_p[], threadDB_ItemInfo *pItemHandle_p=0)
C++ wrapper to store a data item in the selected package see ThreadDB_Store.
Definition: threaddbCPP.h:234
std::mutex m_InsertMutex
Definition: threaddbRGrid.h:242
bool intersects(const Box< C, D > &rLhs_p, const Box< C, D > &rRhs_p)
Check intersection of two Boxes.
Definition: threaddbRGrid.h:171
Point basic class definition.
Definition: threaddbRGrid.h:61
void add(const Box_ &rBox_p, const T &rData_p)
Definition: threaddbRGrid.h:648
T _c[D]
Definition: threaddbRGrid.h:121
T & z()
Definition: threaddbRGrid.h:89
External representation of the rgrid structure.
Definition: threaddbRGrid.h:186
Definition: threaddbCPP.h:28
friend L
Definition: threaddbRGrid.h:580
tdb::Point< C, D > operator+(const tdb::Point< C, D > &a, const tdb::Point< C, D > &b)
Point increment operator.
Definition: threaddbRGrid.h:883
friend std::istream & operator>>(std::istream &is, Link &L)
Definition: threaddbRGrid.h:236
void recurse(const Box_ &rBox_p, Functor< T > &rCallback_p, tdb::database &rDb_p, std::atomic< uint16_t > *pTaskCount_p, std::mutex *pThreadMutex_p, std::vector< TaskInfo_ * > *pTaskHeap_p) const
Recursion into the next cell level.
Definition: threaddbRGrid.h:870
bool End(const tdb::ReadInfo &rReadInfo_p) const
C++ wrapper for stream end indicator see ThreadDB_PackageEnd.
Definition: threaddbCPP.h:302
friend std::istream & operator>>(std::istream &is, Point &P)
Definition: threaddbRGrid.h:114
bool intersects(const Box_ &rBox_p) const
Box intersection of two elements.
Definition: threaddbRGrid.h:860
rgrid_()
Definition: threaddbRGrid.h:583
Box(const Point_ &rMin_p, const Point_ &rMax_p)
Definition: threaddbRGrid.h:135
~Cells()
Definition: threaddbRGrid.h:462
virtual void operator()(const T &)=0
size_t size() const
Definition: threaddbRGrid.h:466
std::condition_variable m_Signal
Definition: threaddbRGrid.h:258
rgrid(std::istream &is, tdb::database &rDb_p)
Definition: threaddbRGrid.h:639
void add(const Box_ &rBox_p, const T &rData_p, tdb::database &rDb_p)
Routine to add a new element to the rgrid.
Definition: threaddbRGrid.h:716
Point(T x_p, T y_p)
Definition: threaddbRGrid.h:69
Point< T, D > Point_
Definition: threaddbRGrid.h:131
friend std::istream & operator>>(std::istream &is, Box &L)
Definition: threaddbRGrid.h:154
const Point_ & min_corner() const
Definition: threaddbRGrid.h:141
char m_Membuf[sizeof(rgrid_< T, C, D, Link >)]
Definition: threaddbRGrid.h:243
std::pair< Box_, int32_t > index(const Box_ &rBox_p) const
Definition: threaddbRGrid.h:468
friend std::istream & operator>>(std::istream &is, rgrid_ &R)
Definition: threaddbRGrid.h:567
friend std::ostream & operator<<(std::ostream &os, const Link &L)
Definition: threaddbRGrid.h:230
Point()
Definition: threaddbRGrid.h:63
std::atomic< size_t > m_MaxShapeSize
Definition: threaddbRGrid.h:616
friend std::istream & operator>>(std::istream &is, Cells &C_)
Definition: threaddbRGrid.h:510
std::shared_ptr< L > m_Subcells[1<< D]
Definition: threaddbRGrid.h:528
T & y()
Definition: threaddbRGrid.h:86
C++ wrapper class of the threadDB file mapped memory container extension.
Definition: threaddbCPP.h:97
std::shared_ptr< L > operator[](size_t idx_p)
Definition: threaddbRGrid.h:474
const T x() const
Definition: threaddbRGrid.h:82
TaskInfo< Link > TaskInfo_
Definition: threaddbRGrid.h:202
friend std::ostream & operator<<(std::ostream &os, const rgrid &R)
Definition: threaddbRGrid.h:696
Point_ & min_corner()
Definition: threaddbRGrid.h:142
const Point_ & max_corner() const
Definition: threaddbRGrid.h:144
Box_ m_Box
Definition: threaddbRGrid.h:525
size_t dimension()
Definition: threaddbRGrid.h:105
friend std::ostream & operator<<(std::ostream &os, const rgrid_ &R)
Definition: threaddbRGrid.h:555
uint8_t m_Subcount
Definition: threaddbRGrid.h:529
void recurse(const Box_ &rBox_p, Functor< T > &rCallback_p, tdb::database &rDb_p, std::atomic< uint16_t > *pTaskCount_p, std::mutex *pThreadMutex_p, std::vector< TaskInfo_ * > *pTaskHeap_p) const
Recursion into next level of the rgrid cells.
Definition: threaddbRGrid.h:797
TaskInfo< L > TaskInfo_
Definition: threaddbRGrid.h:541
friend std::ostream & operator<<(std::ostream &os, const Cells &C_)
Definition: threaddbRGrid.h:493
friend std::ostream & operator<<(std::ostream &os, const Box &L)
Definition: threaddbRGrid.h:147
~rgrid_()
Definition: threaddbRGrid.h:551
Point(T x_p)
Definition: threaddbRGrid.h:64
rgrid(const Box_ &rBox_p, uint32_t Depth_p, tdb::database &rDb_p)
Definition: threaddbRGrid.h:632
tdb::Point< C, D > operator-(const tdb::Point< C, D > &a, const tdb::Point< C, D > &b)
Point subtract operator.
Definition: threaddbRGrid.h:893
std::mutex m_InsertMutex
Definition: threaddbRGrid.h:526
tdb::ReadInfo Open(uint64_t Package_p)
C++ wrapper to open a package for stream reading see ThreadDB_Open.
Definition: threaddbCPP.h:263
Point & operator+=(const Point &rhs_p)
Definition: threaddbRGrid.h:91
Link()
Definition: threaddbRGrid.h:204
static void loop(const Box_ &rBox_p, Functor< T > *pCallback_p, tdb::database *pDb_p, bool Continue_p, TaskInfo_ *pTaskInfo_p, std::atomic< uint16_t > *pTaskCount_p, std::mutex *pThreadMutex_p, std::vector< TaskInfo_ * > *pTaskHeap_p, bool *pThreadExit_p)
Main query loop for parallel thread execution.
Definition: threaddbRGrid.h:742
const T y() const
Definition: threaddbRGrid.h:85
const std::shared_ptr< L > operator[](size_t idx_p) const
Definition: threaddbRGrid.h:473
Point & operator-=(const Point &rhs_p)
Definition: threaddbRGrid.h:98
Definition: threaddbRGrid.h:38
Link helper class to the next node level.
Definition: threaddbRGrid.h:199
std::atomic< size_t > m_Size
Definition: threaddbRGrid.h:615
Cells(const Box_ &rBox_p)
Definition: threaddbRGrid.h:454
Internal representation of the rgrid structure.
Definition: threaddbRGrid.h:189