33#ifndef WOSS_DB_CUSTOM_DATA_CONTAINER_H
34#define WOSS_DB_CUSTOM_DATA_CONTAINER_H
53 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp = std::less<T>,
class M
idComp = std::less<
double>,
class InComp = std::less<
double> >
61 using InnerData =
typename std::map< double, Data, InComp >;
70 using MediumData =
typename std::map< double, InnerData, MidComp >;
80 using CDCIt =
typename CustomContainer::iterator;
81 using CDCRIt =
typename CustomContainer::reverse_iterator;
82 using CDCCIt =
typename CustomContainer::const_iterator;
83 using CDCCRIt =
typename CustomContainer::const_reverse_iterator;
87 #if __cplusplus >= 201103L
151 const std::optional< Data >
get(
const T& tx,
const T& rx )
const;
241 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
245 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
247 if ( data_map.empty() )
251 std::cout <<
"CustomDataContainer::get() t = " << t <<
"; b = " << b <<
"; r = " << r << std::endl;
257 CDCCIt it = data_map.find( t );
258 if ( it == data_map.end() )
267 if ( it2 == it->second.end() ) {
268 if( rit2 == it->second.rend() )
270 it3 = rit2->second.lower_bound( r );
271 rit3 = rit2->second.rbegin();
272 if ( it3 != rit2->second.end() )
274 if ( rit3 != rit2->second.rend() )
279 it3 = it2->second.lower_bound( r );
280 rit3 = it2->second.rbegin();
281 if ( it3 != it2->second.end() )
283 if ( rit3 != it2->second.rend() )
287 if ( it3 == it2->second.end() )
289 return (it3->second);
293 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
295 MidFunctor mid_funct;
302 double min_dist = INFINITY;
303 std::optional< Data > ret_val = {};
305 if ( data_map.empty() ==
true ) {
306 if ( debug ) std::cout <<
"CustomDataContainer::get() data_map is empty " << std::endl;
311 for (
auto it = data_map.cbegin(); it != data_map.cend(); it++ ) {
313 std::cout <<
"CustomDataContainer::get() start T = " << it->first <<
"; end T = " << rx << std::endl;
315 if ( it->first == DB_CDATA_ALL_OUTER_KEYS ) {
317 std::cout <<
"CustomDataContainer::get() overriding start T = " << tx <<
"; end T = " << rx << std::endl;
319 curr_b = mid_funct(tx,rx);
320 curr_r = in_funct(tx,rx);
323 curr_b = mid_funct(it->first,rx);
324 curr_r = in_funct(it->first,rx);
328 std::cout <<
"CustomDataContainer::get() curr bearing = " << curr_b * 180.0 / M_PI
329 <<
"; curr range = " << curr_r << std::endl;
331 auto itb = it->second.cbegin();
332 if ( itb->first == DB_CDATA_ALL_MEDIUM_KEYS )
335 itb = it->second.lower_bound( curr_b );
336 if ( itb == it->second.cend() )
337 itb = (++(it->second.rbegin())).base();
339 delta_b = curr_b - itb->first;
343 delta_b = 2.0*M_PI - delta_b ;
346 double ort_dist = curr_r * sin(delta_b);
347 double ort_projection = std::sqrt( curr_r*curr_r - ort_dist*ort_dist );
350 std::cout <<
"CustomDataContainer::get() nearest bearing = " << itb->first * 180.0 / M_PI
351 <<
"; diff bearing = " << delta_b * 180.0 / M_PI <<
"; orthog distance = " << ort_dist
352 <<
"; orthog range projection = " << ort_projection << std::endl;
354 auto itr = itb->second.cbegin();
355 if ( itr->first == DB_CDATA_ALL_INNER_KEYS )
356 curr_dist = ort_dist;
358 itr = itb->second.lower_bound( ort_projection );
359 if ( itr == itb->second.cbegin() || itr == itb->second.cend() || itr->first == ort_projection ) {
360 if ( itr == itb->second.cend() )
361 itr = (++(itb->second.rbegin())).base();
362 double adj_distance = std::abs( ort_projection - itr->first );
363 curr_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
366 double adj_distance = std::abs( ort_projection - itr->first );
367 double first_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
370 std::cout <<
"CustomDataContainer::get() first try, range = " << itr->first
371 <<
"; dist = " << first_dist << std::endl;
374 adj_distance = std::abs( ort_projection - itr->first );
375 double before_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
378 std::cout <<
"CustomDataContainer::get() second try, range = " << itr->first
379 <<
"; dist = " << before_dist << std::endl;
381 curr_dist = std::min( first_dist, before_dist );
382 if ( curr_dist == first_dist )
387 std::cout <<
"CustomDataContainer::get() nearest range = " << itr->first <<
"; distance = " << curr_dist
388 <<
"; min distance = " << min_dist << std::endl;
390 if ( curr_dist < min_dist ) {
391 min_dist = curr_dist;
392 ret_val = itr->second;
393 if ( curr_dist == 0 )
399 if ( debug && ret_val )
400 std::cout <<
"CustomDataContainer::get() ret value " << *ret_val << std::endl;
406 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
410 std::cout <<
"CustomDataContainer::find() << t = " << t <<
"; b = " << b <<
"; r = " << r << std::endl;
412 CDCCIt it = data_map.find( t );
413 if ( it == data_map.end() ) {
416 std::cout <<
"CustomDataContainer::find() t not found" << std::endl;
422 std::cout <<
"CustomDataContainer::find() t found" << std::endl;
425 if ( it2 == it->second.end() ) {
427 std::cout <<
"CustomDataContainer::find() b not found" << std::endl;
433 std::cout <<
"CustomDataContainer::find() b found" << std::endl;
436 if ( it3 == it2->second.end() ) {
439 std::cout <<
"CustomDataContainer::find() r not found" << std::endl;
444 std::cout <<
"CustomDataContainer::find() r found, data = " << it3->second << std::endl;
449 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
451 auto res = find( t, b, r );
454 data_map[t][b][r] = d;
459 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
461 data_map[t][b].erase(r);
462 data_map[t][b][r] = d;
466 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
468 data_map[t][b].erase(r);
469 if ( data_map[t][b].empty() )
470 data_map[t].erase(b);
471 if ( data_map[t].empty() )
476 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
489 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp = std::less<T>,
class M
idComp = std::less<
double>,
class InComp = std::less<
double> >
497 using TimeData =
typename std::map< time_t, Data >;
506 using InnerData =
typename std::map< double, TimeData, InComp >;
515 using MediumData =
typename std::map< double, InnerData, MidComp >;
525 using CDCIt =
typename CustomContainer::iterator;
526 using CDCRIt =
typename CustomContainer::reverse_iterator;
527 using CDCCIt =
typename CustomContainer::const_iterator;
528 using CDCCRIt =
typename CustomContainer::const_reverse_iterator;
704 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
708 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
709 const Time CustomDataTimeContainer< T, MidFunctor, InFunctor, Data, OutComp, MidComp, InComp >::DB_CDATA_ALL_TIME_KEYS =
Time(1, 1, 1901, 0, 0, 0);
712 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
714 if ( data_map.empty() )
718 std::cout <<
"CustomDataTimeContainer::get() t = " << t <<
"; b = " << b <<
"; r = " << r
719 <<
"; time_key = " << time_key << std::endl;
721 auto ret_val = find();
725 CDCCIt it = data_map.find( t );
726 if ( it == data_map.end() )
735 if ( it2 == it->second.end() ) {
736 if ( rit2 == it->second.rend() )
738 it3 = rit2->second.lower_bound( r );
739 rit3 = rit2->second.rbegin();
740 if ( it3 != rit2->second.end() )
741 return calculateData( it3->second, time_key);
742 if ( rit3 != rit2->second.rend() )
743 return calculateData( rit3->second, time_key);
747 it3 = it2->second.lower_bound( r );
748 rit3 = it2->second.rbegin();
749 if ( it3 != it2->second.end() )
750 return calculateData(it3->second, time_key);
751 if ( rit3 != it2->second.rend() )
752 return calculateData(rit3->second, time_key);
755 if ( it3 == it2->second.end() )
757 return calculateData(it3->second, time_key);
761 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
763 MidFunctor mid_funct;
772 double min_dist = INFINITY;
774 if ( data_map.empty() ==
true ) {
776 std::cout <<
"CustomDataTimeContainer::get() data_map is empty " << std::endl;
780 const TimeData* time_data_ptr =
nullptr;
782 for (
CDCCIt it = data_map.begin(); it != data_map.end(); it++ ) {
784 std::cout <<
"CustomDataTimeContainer::get() start T = " << it->first <<
"; end T = " << rx << std::endl;
786 if ( it->first == DB_CDATA_ALL_OUTER_KEYS ) {
788 std::cout <<
"CustomDataTimeContainer::get() overriding start T = " << tx <<
"; end T = " << rx << std::endl;
790 curr_b = mid_funct(tx,rx);
791 curr_r = in_funct(tx,rx);
794 curr_b = mid_funct(it->first,rx);
795 curr_r = in_funct(it->first,rx);
799 std::cout <<
"CustomDataTimeContainer::get() curr bearing = " << curr_b * 180.0 / M_PI
800 <<
"; curr range = " << curr_r << std::endl;
803 if ( itb->first == DB_CDATA_ALL_MEDIUM_KEYS )
806 itb = it->second.lower_bound( curr_b );
807 if ( itb == it->second.end() )
808 itb = (++(it->second.rbegin())).base();
810 delta_b = curr_b - itb->first;
814 delta_b = 2.0*M_PI - delta_b ;
817 double ort_dist = curr_r * sin(delta_b);
818 double ort_projection = std::sqrt( curr_r*curr_r - ort_dist*ort_dist );
821 std::cout <<
"CustomDataTimeContainer::get() nearest bearing = " << itb->first * 180.0 / M_PI
822 <<
"; diff bearing = " << delta_b * 180.0 / M_PI <<
"; orthog distance = " << ort_dist
823 <<
"; orthog range projection = " << ort_projection << std::endl;
826 if ( itr->first == DB_CDATA_ALL_INNER_KEYS )
827 curr_dist = ort_dist;
829 itr = itb->second.lower_bound( ort_projection );
830 if ( itr == itb->second.begin() || itr == itb->second.end() || itr->first == ort_projection ) {
831 if ( itr == itb->second.end() ) itr = (++(itb->second.rbegin())).base();
832 double adj_distance = std::abs( ort_projection - itr->first );
833 curr_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
836 double adj_distance = std::abs( ort_projection - itr->first );
837 double first_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
840 std::cout <<
"CustomDataTimeContainer::get() first try, range = " << itr->first
841 <<
"; dist = " << first_dist << std::endl;
844 adj_distance = std::abs( ort_projection - itr->first );
845 double before_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
848 std::cout <<
"CustomDataTimeContainer::get() second try, range = " << itr->first
849 <<
"; dist = " << before_dist << std::endl;
851 curr_dist = std::min( first_dist, before_dist );
852 if ( curr_dist == first_dist )
857 std::cout <<
"CustomDataTimeContainer::get() nearest range = " << itr->first <<
"; distance = " << curr_dist
858 <<
"; min distance = " << min_dist << std::endl;
860 if ( curr_dist < min_dist ) {
861 min_dist = curr_dist;
862 time_data_ptr = &(itr->second);
863 if ( curr_dist == 0 )
869 if ( time_data_ptr !=
nullptr )
870 return calculateData( *time_data_ptr, time_key);
875 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
878 std::cout <<
"CustomDataTimeContainer::find() << t = " << t <<
"; b = " << b <<
"; r = "
879 << r <<
"; time_key = " << time_key << std::endl;
881 CDCCIt it = data_map.find( t );
882 if ( it == data_map.end() ) {
885 std::cout <<
"CustomDataTimeContainer::find() t not found" << std::endl;
890 if ( debug ) std::cout <<
"CustomDataTimeContainer::find() t found" << std::endl;
893 if ( it2 == it->second.end() ) {
895 std::cout <<
"CustomDataTimeContainer::find() b not found" << std::endl;
900 if ( debug ) std::cout <<
"CustomDataTimeContainer::find() b found" << std::endl;
903 if ( it3 == it2->second.end() ) {
905 std::cout <<
"CustomDataTimeContainer::find() r not found" << std::endl;
909 if ( debug ) std::cout <<
"CustomDataTimeContainer::find() r found" << std::endl;
912 if ( it4 == it3->second.end() ) {
914 std::cout <<
"CustomDataTimeContainer::find() time_key not found" << std::endl;
919 if ( debug ) std::cout <<
"CustomDataTimeContainer::find() time_key found, Data = " << it4->second << std::endl;
925 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
926 bool CustomDataTimeContainer< T, MidFunctor, InFunctor, Data, OutComp, MidComp, InComp >::insert(
const Data& d,
const T& t,
double b,
double r,
const Time& time_key ) {
927 auto data = find( t, b, r, time_key );
930 data_map[t][b][r][time_key] = d;
935 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
936 void CustomDataTimeContainer< T, MidFunctor, InFunctor, Data, OutComp, MidComp, InComp >::replace(
const Data& d,
const T& t,
double b,
double r,
const Time& time_key ) {
937 data_map[t][b][r][time_key] = d;
941 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
943 data_map[t][b][r].erase(time_key);
944 if ( data_map[t][b][r].empty() )
945 data_map[t][b].erase(r);
946 if ( data_map[t][b].empty() )
947 data_map[t].erase(b);
948 if ( data_map[t].empty() )
953 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
958 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
961 std::cout <<
"CustomDataTimeContainer::calculateData() time_key = " << time_key << std::endl;
963 if ( time_data.empty() ) {
965 std::cout <<
"CustomDataTimeContainer::calculateData() time_data is empty." << std::endl;
970 if ( time_data.size() == 1 ) {
972 std::cout <<
"CustomDataTimeContainer::calculateData() time_data has size 1. Data created "
973 << time_data.begin()->second << std::endl;
975 return time_data.begin()->second;
978 time_t normalized_time = time_key;
980 if ( normalized_time < time_data.begin()->first ) {
982 std::cout <<
"CustomDataTimeContainer::calculateData() time_key has time < first key. Data created "
983 << time_data.begin()->second << std::endl;
985 return time_data.begin()->second;
988 normalized_time %= ( time_data.rbegin()->first - time_data.begin()->first );
989 if ( normalized_time == 0 )
990 return time_data.begin()->second;
992 normalized_time += time_data.begin()->first;
993 auto upper_it = time_data.upper_bound(normalized_time);
994 auto lower_it = upper_it;
997 double alpha = ( std::abs((
double)(upper_it->first - normalized_time)) / std::abs((
double)( upper_it->first - lower_it->first )) );
998 double beta = ( std::abs((
double)(normalized_time - lower_it->first)) / std::abs((
double)( upper_it->first - lower_it->first )) );
1001 std::cout <<
"CustomDataTimeContainer::calculateData() normalized_time = " << normalized_time
1002 <<
"; lower_it time = " << lower_it->first
1003 <<
"; upper_it time = " << upper_it->first
1004 <<
"; alpha = " << alpha <<
"; beta " << beta << std::endl;
1006 Data ret_val = lower_it->second * alpha + upper_it->second * beta;
1009 std::cout <<
"CustomDataTimeContainer::calculateData() return value = "
1010 << ret_val << std::endl;
1019 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1028 using TimeData =
typename std::map< time_t, std::shared_ptr< Data > >;
1037 using InnerData =
typename std::map< double, TimeData, InComp >;
1046 using MediumData =
typename std::map< double, InnerData, MidComp >;
1056 using CDCIt =
typename CustomContainer::iterator;
1057 using CDCRIt =
typename CustomContainer::reverse_iterator;
1058 using CDCCIt =
typename CustomContainer::const_iterator;
1059 using CDCCRIt =
typename CustomContainer::const_reverse_iterator;
1239 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1243 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1244 const Time CustomDataTimeContainer< T, MidFunctor, InFunctor, std::shared_ptr< Data >, OutComp, MidComp, InComp >::DB_CDATA_ALL_TIME_KEYS =
Time(1, 1, 1901, 0, 0, 0);
1247 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1249 if ( data_map.empty() )
1253 std::cout <<
"CustomDataTimeContainer::get() t = " << t <<
"; b = " << b <<
"; r = " << r
1254 <<
"; time_key = " << time_key << std::endl;
1256 auto ret_val = find();
1260 CDCCIt it = data_map.find( t );
1261 if ( it == data_map.end() )
1270 if ( it2 == it->second.end() ) {
1271 if ( rit2 == it->second.rend() )
1273 it3 = rit2->second.lower_bound( r );
1274 rit3 = rit2->second.rbegin();
1275 if ( it3 != rit2->second.end() )
1276 return calculateData( it3->second, time_key);
1277 if ( rit3 != rit2->second.rend() )
1278 return calculateData( rit3->second, time_key);
1282 it3 = it2->second.lower_bound( r );
1283 rit3 = it2->second.rbegin();
1284 if ( it3 != it2->second.end() )
1285 return calculateData(it3->second, time_key);
1286 if ( rit3 != it2->second.rend() )
1287 return calculateData(rit3->second, time_key);
1290 if ( it3 == it2->second.end() )
1292 return calculateData(it3->second, time_key);
1296 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1298 MidFunctor mid_funct;
1307 double min_dist = INFINITY;
1309 if ( data_map.empty() ==
true ) {
1311 std::cout <<
"CustomDataTimeContainer::get() data_map is empty " << std::endl;
1315 const TimeData* time_data_ptr =
nullptr;
1317 for (
CDCCIt it = data_map.begin(); it != data_map.end(); it++ ) {
1319 std::cout <<
"CustomDataTimeContainer::get() start T = " << it->first <<
"; end T = " << rx << std::endl;
1321 if ( it->first == DB_CDATA_ALL_OUTER_KEYS ) {
1323 std::cout <<
"CustomDataTimeContainer::get() overriding start T = " << tx <<
"; end T = " << rx << std::endl;
1325 curr_b = mid_funct(tx,rx);
1326 curr_r = in_funct(tx,rx);
1329 curr_b = mid_funct(it->first,rx);
1330 curr_r = in_funct(it->first,rx);
1334 std::cout <<
"CustomDataTimeContainer::get() curr bearing = " << curr_b * 180.0 / M_PI
1335 <<
"; curr range = " << curr_r << std::endl;
1338 if ( itb->first == DB_CDATA_ALL_MEDIUM_KEYS )
1341 itb = it->second.lower_bound( curr_b );
1342 if ( itb == it->second.end() )
1343 itb = (++(it->second.rbegin())).base();
1345 delta_b = curr_b - itb->first;
1349 delta_b = 2.0*M_PI - delta_b ;
1352 double ort_dist = curr_r * sin(delta_b);
1353 double ort_projection = std::sqrt( curr_r*curr_r - ort_dist*ort_dist );
1356 std::cout <<
"CustomDataTimeContainer::get() nearest bearing = " << itb->first * 180.0 / M_PI
1357 <<
"; diff bearing = " << delta_b * 180.0 / M_PI <<
"; orthog distance = " << ort_dist
1358 <<
"; orthog range projection = " << ort_projection << std::endl;
1361 if ( itr->first == DB_CDATA_ALL_INNER_KEYS )
1362 curr_dist = ort_dist;
1364 itr = itb->second.lower_bound( ort_projection );
1365 if ( itr == itb->second.begin() || itr == itb->second.end() || itr->first == ort_projection ) {
1366 if ( itr == itb->second.end() ) itr = (++(itb->second.rbegin())).base();
1367 double adj_distance = std::abs( ort_projection - itr->first );
1368 curr_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
1371 double adj_distance = std::abs( ort_projection - itr->first );
1372 double first_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
1375 std::cout <<
"CustomDataTimeContainer::get() first try, range = " << itr->first
1376 <<
"; dist = " << first_dist << std::endl;
1379 adj_distance = std::abs( ort_projection - itr->first );
1380 double before_dist = std::sqrt( ort_projection*ort_projection + adj_distance*adj_distance );
1383 std::cout <<
"CustomDataTimeContainer::get() second try, range = " << itr->first
1384 <<
"; dist = " << before_dist << std::endl;
1386 curr_dist = std::min( first_dist, before_dist );
1387 if ( curr_dist == first_dist )
1392 std::cout <<
"CustomDataTimeContainer::get() nearest range = " << itr->first <<
"; distance = " << curr_dist
1393 <<
"; min distance = " << min_dist << std::endl;
1395 if ( curr_dist < min_dist ) {
1396 min_dist = curr_dist;
1397 time_data_ptr = &(itr->second);
1398 if ( curr_dist == 0 )
1404 if ( time_data_ptr !=
nullptr )
1405 return calculateData( *time_data_ptr, time_key);
1410 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1413 std::cout <<
"CustomDataTimeContainer::find() << t = " << t <<
"; b = " << b <<
"; r = "
1414 << r <<
"; time_key = " << time_key << std::endl;
1416 CDCCIt it = data_map.find( t );
1417 if ( it == data_map.end() ) {
1420 std::cout <<
"CustomDataTimeContainer::find() t not found" << std::endl;
1425 if ( debug ) std::cout <<
"CustomDataTimeContainer::find() t found" << std::endl;
1428 if ( it2 == it->second.end() ) {
1430 std::cout <<
"CustomDataTimeContainer::find() b not found" << std::endl;
1435 if ( debug ) std::cout <<
"CustomDataTimeContainer::find() b found" << std::endl;
1438 if ( it3 == it2->second.end() ) {
1440 std::cout <<
"CustomDataTimeContainer::find() r not found" << std::endl;
1444 if ( debug ) std::cout <<
"CustomDataTimeContainer::find() r found" << std::endl;
1447 if ( it4 == it3->second.end() ) {
1449 std::cout <<
"CustomDataTimeContainer::find() time_key not found" << std::endl;
1455 std::cout <<
"CustomDataTimeContainer::find() time_key found, Data = " << it4->second << std::endl;
1461 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1462 bool CustomDataTimeContainer< T, MidFunctor, InFunctor, std::shared_ptr< Data >, OutComp, MidComp, InComp >::insert(
const std::shared_ptr< Data >& d,
const T& t,
double b,
double r,
const Time& time_key ) {
1463 auto data = find( t, b, r, time_key );
1466 data_map[t][b][r][time_key] = d;
1471 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1472 void CustomDataTimeContainer< T, MidFunctor, InFunctor, std::shared_ptr< Data >, OutComp, MidComp, InComp >::replace(
const std::shared_ptr< Data >& d,
const T& t,
double b,
double r,
const Time& time_key ) {
1473 data_map[t][b][r][time_key] = d;
1477 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1479 data_map[t][b][r].
erase(time_key);
1480 if ( data_map[t][b][r].empty() )
1481 data_map[t][b].erase(r);
1482 if ( data_map[t][b].empty() )
1483 data_map[t].erase(b);
1484 if ( data_map[t].empty() )
1489 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1495 template <
class T,
class M
idFunctor,
class InFunctor,
class Data,
class OutComp,
class M
idComp,
class InComp >
1498 std::cout <<
"CustomDataTimeContainer::calculateData() time_key = " << time_key << std::endl;
1500 if ( time_data.empty() ) {
1502 std::cout <<
"CustomDataTimeContainer::calculateData() time_data is empty." << std::endl;
1507 if ( time_data.size() == 1 ) {
1509 std::cout <<
"CustomDataTimeContainer::calculateData() time_data has size 1. Data created "
1510 << time_data.begin()->second << std::endl;
1512 return time_data.begin()->second;
1515 time_t normalized_time = time_key;
1517 if ( normalized_time < time_data.begin()->first ) {
1519 std::cout <<
"CustomDataTimeContainer::calculateData() time_key has time < first key. Data created "
1520 << time_data.begin()->second << std::endl;
1522 return time_data.begin()->second;
1525 normalized_time %= ( time_data.rbegin()->first - time_data.begin()->first );
1526 if ( normalized_time == 0 )
1527 return time_data.begin()->second;
1529 normalized_time += time_data.begin()->first;
1530 auto upper_it = time_data.upper_bound(normalized_time);
1531 auto lower_it = upper_it;
1534 double alpha = ( std::abs((
double)(upper_it->first - normalized_time)) / std::abs((
double)( upper_it->first - lower_it->first )) );
1535 double beta = ( std::abs((
double)(normalized_time - lower_it->first)) / std::abs((
double)( upper_it->first - lower_it->first )) );
1538 std::cout <<
"CustomDataTimeContainer::calculateData() normalized_time = " << normalized_time
1539 <<
"; lower_it time = " << lower_it->first
1540 <<
"; upper_it time = " << upper_it->first
1541 <<
"; alpha = " << alpha <<
"; beta " << beta << std::endl;
1543 std::shared_ptr< Data > ret_val = std::move(lower_it->second->clone());
1545 *ret_val *= alpha + *(upper_it->second) * beta;
1548 std::cout <<
"CustomDataTimeContainer::calculateData() return value = "
1549 << ret_val << std::endl;
Class for managing custom db data.
Definition woss-db-custom-data-container.h:54
MediumData & operator[](const T &key)
Definition woss-db-custom-data-container.h:116
typename CustomContainer::reverse_iterator CDCRIt
Definition woss-db-custom-data-container.h:81
typename std::map< double, InnerData, MidComp > MediumData
Definition woss-db-custom-data-container.h:70
typename CustomContainer::const_reverse_iterator CDCCRIt
Definition woss-db-custom-data-container.h:83
int size() const
Definition woss-db-custom-data-container.h:130
bool usingDebug()
Definition woss-db-custom-data-container.h:210
static constexpr double DB_CDATA_ALL_MEDIUM_KEYS
Definition woss-db-custom-data-container.h:88
typename MediumData::const_reverse_iterator CDCMediumCRIt
Definition woss-db-custom-data-container.h:74
typename InnerData::iterator CDCInnerIt
Definition woss-db-custom-data-container.h:62
bool insert(const Data &data, const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS)
Definition woss-db-custom-data-container.h:450
typename InnerData::reverse_iterator CDCInnerRIt
Definition woss-db-custom-data-container.h:63
typename MediumData::reverse_iterator CDCMediumRIt
Definition woss-db-custom-data-container.h:73
const std::optional< Data > get(const T &tx, const T &rx) const
Definition woss-db-custom-data-container.h:294
void replace(const Data &data, const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS)
Definition woss-db-custom-data-container.h:460
bool debug
Definition woss-db-custom-data-container.h:219
typename std::map< T, MediumData, OutComp > CustomContainer
Definition woss-db-custom-data-container.h:79
const std::optional< Data > get(const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS) const
Definition woss-db-custom-data-container.h:246
bool empty() const
Definition woss-db-custom-data-container.h:123
~CustomDataContainer()=default
typename InnerData::const_iterator CDCInnerCIt
Definition woss-db-custom-data-container.h:64
typename CustomContainer::iterator CDCIt
Definition woss-db-custom-data-container.h:80
void setDebug(bool flag)
Definition woss-db-custom-data-container.h:203
void clear()
Definition woss-db-custom-data-container.h:477
CustomContainer data_map
Definition woss-db-custom-data-container.h:224
typename MediumData::iterator CDCMediumIt
Definition woss-db-custom-data-container.h:71
std::optional< Data > find(const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS) const
Definition woss-db-custom-data-container.h:407
typename InnerData::const_reverse_iterator CDCInnerCRIt
Definition woss-db-custom-data-container.h:65
typename CustomContainer::const_iterator CDCCIt
Definition woss-db-custom-data-container.h:82
typename MediumData::const_iterator CDCMediumCIt
Definition woss-db-custom-data-container.h:72
static constexpr double DB_CDATA_ALL_INNER_KEYS
Definition woss-db-custom-data-container.h:90
void erase(const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS)
Definition woss-db-custom-data-container.h:467
typename std::map< double, Data, InComp > InnerData
Definition woss-db-custom-data-container.h:61
static const T DB_CDATA_ALL_OUTER_KEYS
Definition woss-db-custom-data-container.h:97
CustomDataContainer()=default
~CustomDataTimeContainer()=default
typename TimeData::const_iterator CDTCTimeCIt
Definition woss-db-custom-data-container.h:1031
typename TimeData::iterator CDTCTimeIt
Definition woss-db-custom-data-container.h:1029
typename TimeData::reverse_iterator CDTCTimeRIt
Definition woss-db-custom-data-container.h:1030
CustomDataTimeContainer()
Definition woss-db-custom-data-container.h:1077
CustomContainer data_map
Definition woss-db-custom-data-container.h:1207
bool usingDebug() const
Definition woss-db-custom-data-container.h:1192
static const Time DB_CDATA_ALL_TIME_KEYS
Definition woss-db-custom-data-container.h:1071
typename InnerData::reverse_iterator CDCInnerRIt
Definition woss-db-custom-data-container.h:1039
typename TimeData::const_reverse_iterator CDTCTimeCRIt
Definition woss-db-custom-data-container.h:1032
typename InnerData::const_reverse_iterator CDCInnerCRIt
Definition woss-db-custom-data-container.h:1041
static const T DB_CDATA_ALL_OUTER_KEYS
Definition woss-db-custom-data-container.h:1069
typename MediumData::const_iterator CDCMediumCIt
Definition woss-db-custom-data-container.h:1048
int size() const
Definition woss-db-custom-data-container.h:1103
typename CustomContainer::reverse_iterator CDCRIt
Definition woss-db-custom-data-container.h:1057
bool empty() const
Definition woss-db-custom-data-container.h:1096
typename MediumData::reverse_iterator CDCMediumRIt
Definition woss-db-custom-data-container.h:1049
typename std::map< double, InnerData, MidComp > MediumData
Definition woss-db-custom-data-container.h:1046
void setDebug(bool flag)
Definition woss-db-custom-data-container.h:1185
typename CustomContainer::const_reverse_iterator CDCCRIt
Definition woss-db-custom-data-container.h:1059
typename MediumData::const_reverse_iterator CDCMediumCRIt
Definition woss-db-custom-data-container.h:1050
typename MediumData::iterator CDCMediumIt
Definition woss-db-custom-data-container.h:1047
typename CustomContainer::const_iterator CDCCIt
Definition woss-db-custom-data-container.h:1058
typename std::map< T, MediumData, OutComp > CustomContainer
Definition woss-db-custom-data-container.h:1055
bool debug
Definition woss-db-custom-data-container.h:1201
typename std::map< double, TimeData, InComp > InnerData
Definition woss-db-custom-data-container.h:1037
typename InnerData::const_iterator CDCInnerCIt
Definition woss-db-custom-data-container.h:1040
typename InnerData::iterator CDCInnerIt
Definition woss-db-custom-data-container.h:1038
typename CustomContainer::iterator CDCIt
Definition woss-db-custom-data-container.h:1056
typename std::map< time_t, std::shared_ptr< Data > > TimeData
Definition woss-db-custom-data-container.h:1028
Class for managing custom db data.
Definition woss-db-custom-data-container.h:490
typename MediumData::const_iterator CDCMediumCIt
Definition woss-db-custom-data-container.h:517
typename CustomContainer::iterator CDCIt
Definition woss-db-custom-data-container.h:525
std::optional< Data > calculateData(const TimeData &time_data, const Time &time_key=DB_CDATA_ALL_TIME_KEYS) const
Definition woss-db-custom-data-container.h:959
bool insert(const Data &data, const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS, const Time &time_key=DB_CDATA_ALL_TIME_KEYS)
Definition woss-db-custom-data-container.h:926
bool empty() const
Definition woss-db-custom-data-container.h:562
typename std::map< T, MediumData, OutComp > CustomContainer
Definition woss-db-custom-data-container.h:524
typename std::map< double, InnerData, MidComp > MediumData
Definition woss-db-custom-data-container.h:515
typename CustomContainer::const_reverse_iterator CDCCRIt
Definition woss-db-custom-data-container.h:528
typename MediumData::iterator CDCMediumIt
Definition woss-db-custom-data-container.h:516
static constexpr double DB_CDATA_ALL_INNER_KEYS
Definition woss-db-custom-data-container.h:534
typename TimeData::iterator CDTCTimeIt
Definition woss-db-custom-data-container.h:498
typename std::map< time_t, Data > TimeData
Definition woss-db-custom-data-container.h:497
typename InnerData::const_reverse_iterator CDCInnerCRIt
Definition woss-db-custom-data-container.h:510
std::optional< Data > find(const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS, const Time &time_key=DB_CDATA_ALL_TIME_KEYS) const
Definition woss-db-custom-data-container.h:876
bool usingDebug() const
Definition woss-db-custom-data-container.h:658
static constexpr double DB_CDATA_ALL_MEDIUM_KEYS
Definition woss-db-custom-data-container.h:532
void erase(const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS, const Time &time_key=DB_CDATA_ALL_TIME_KEYS)
Definition woss-db-custom-data-container.h:942
typename TimeData::const_iterator CDTCTimeCIt
Definition woss-db-custom-data-container.h:500
typename std::map< double, TimeData, InComp > InnerData
Definition woss-db-custom-data-container.h:506
typename InnerData::iterator CDCInnerIt
Definition woss-db-custom-data-container.h:507
typename CustomContainer::reverse_iterator CDCRIt
Definition woss-db-custom-data-container.h:526
MediumData & operator[](const T &key)
Definition woss-db-custom-data-container.h:555
std::optional< Data > get(const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS, const Time &time_key=DB_CDATA_ALL_TIME_KEYS) const
Definition woss-db-custom-data-container.h:713
void replace(const Data &data, const T &t=DB_CDATA_ALL_OUTER_KEYS, double b=DB_CDATA_ALL_MEDIUM_KEYS, double r=DB_CDATA_ALL_INNER_KEYS, const Time &time_key=DB_CDATA_ALL_TIME_KEYS)
Definition woss-db-custom-data-container.h:936
typename TimeData::reverse_iterator CDTCTimeRIt
Definition woss-db-custom-data-container.h:499
static const Time DB_CDATA_ALL_TIME_KEYS
Definition woss-db-custom-data-container.h:538
typename InnerData::const_iterator CDCInnerCIt
Definition woss-db-custom-data-container.h:509
bool debug
Definition woss-db-custom-data-container.h:667
CustomContainer data_map
Definition woss-db-custom-data-container.h:672
typename MediumData::reverse_iterator CDCMediumRIt
Definition woss-db-custom-data-container.h:518
typename TimeData::const_reverse_iterator CDTCTimeCRIt
Definition woss-db-custom-data-container.h:501
int size() const
Definition woss-db-custom-data-container.h:569
CustomDataTimeContainer()
Definition woss-db-custom-data-container.h:543
static const T DB_CDATA_ALL_OUTER_KEYS
Definition woss-db-custom-data-container.h:536
typename MediumData::const_reverse_iterator CDCMediumCRIt
Definition woss-db-custom-data-container.h:519
void clear()
Definition woss-db-custom-data-container.h:954
std::optional< Data > get(const T &tx, const T &rx, const Time &time_key=DB_CDATA_ALL_TIME_KEYS) const
Definition woss-db-custom-data-container.h:762
typename InnerData::reverse_iterator CDCInnerRIt
Definition woss-db-custom-data-container.h:508
void setDebug(bool flag)
Definition woss-db-custom-data-container.h:651
~CustomDataTimeContainer()=default
typename CustomContainer::const_iterator CDCCIt
Definition woss-db-custom-data-container.h:527
a class for time date manipulation
Definition time-definitions.h:83
Definition ac-toolbox-arr-asc-reader.h:44
Definitions and library for woss::Time, woss::SimTime, woss::TimeReference and woss::TimeReferenceTcl...