29 #include <vq3Utils.hpp>
30 #include <vq3Stats.hpp>
33 #include <type_traits>
62 template<
typename T>
using sfinae_test = void;
70 template<
typename T,
typename =
void>
struct is_decorated : std::false_type {};
71 template<
typename T>
struct is_decorated<void, T> : std::false_type {};
72 template<
typename T,
typename =
void>
struct has_value : std::false_type {};
73 template<
typename T>
struct has_value<void, T> : std::false_type {};
76 template<
typename T>
struct is_decorated<T, sfinae_test<typename T::decorated_type> > : std::true_type {};
77 template<
typename T>
struct has_value <T, sfinae_test<decltype(std::declval<T>().vq3_value)> > : std::true_type {};
83 template<
typename KIND>
84 struct print {
void operator()() {std::cout <<
"none" << std::endl;}};
104 template<
typename MOTHER,
typename KIND>
127 template<
typename MOTHER>
149 template<
typename MOTHER>
177 template<
typename MOTHER>
178 using decorator = Decorator<MOTHER, typename vq3::decorator::decoration<MOTHER>::value_type>;
184 namespace decorator {
193 template<
typename MOTHER,
typename KIND>
195 using decorated_type =
typename MOTHER::decorated_type;
198 None(
const decorated_type& val) : MOTHER(val) {}
199 None& operator=(
const decorated_type& val) {this->vq3_value = val;}
203 template<
typename MOTHER>
205 using decorated_type = MOTHER;
209 None(
const decorated_type& val) : vq3_value(val) {}
210 None& operator=(
const decorated_type& val) {vq3_value = val;}
214 template<
typename MOTHER>
216 using decorated_type = MOTHER;
224 using decorated_type = void;
229 template<
typename MOTHER>
239 template<
typename MOTHER,
typename KIND>
241 using decorated_type =
typename MOTHER::decorated_type;
242 bool vq3_tag =
false;
245 Tagged(
const decorated_type& val) : MOTHER(val), vq3_tag(
false) {}
246 Tagged& operator=(
const decorated_type& val) {this->vq3_value = val;}
250 template<
typename MOTHER>
252 using decorated_type = MOTHER;
254 bool vq3_tag =
false;
257 Tagged(
const decorated_type& val) : vq3_value(val), vq3_tag(
false) {}
258 Tagged& operator=(
const decorated_type& val) {vq3_value = val;}
262 template<
typename MOTHER>
264 using decorated_type = MOTHER;
265 bool vq3_tag =
false;
266 Tagged() : MOTHER(), vq3_tag(
false) {}
273 using decorated_type = void;
274 bool vq3_tag =
false;
275 Tagged() : vq3_tag(
false) {}
279 template<
typename MOTHER>
289 template<
typename MOTHER,
typename KIND>
291 using decorated_type =
typename MOTHER::decorated_type;
292 std::atomic_size_t vq3_counter = 0;
295 Counter(
const decorated_type& val) : MOTHER(val), vq3_counter(0) {}
296 Counter& operator=(
const decorated_type& val) {this->vq3_value = val;}
300 template<
typename MOTHER>
302 using decorated_type = MOTHER;
304 std::atomic_size_t vq3_counter = 0;
308 Counter(
const Counter& other) : vq3_value(other.vq3_value), vq3_counter(0){}
309 Counter(
const decorated_type& val) : vq3_value(val), vq3_counter(0) {}
310 Counter& operator=(
const decorated_type& val) {vq3_value = val;}
314 template<
typename MOTHER>
316 using decorated_type = MOTHER;
317 std::atomic_size_t vq3_counter = 0;
318 Counter() : MOTHER(), vq3_counter(0) {}
325 using decorated_type = void;
326 std::atomic_size_t vq3_counter = 0;
331 template<
typename MOTHER>
340 template<
typename MOTHER,
typename COST_TYPE,
typename KIND>
342 using decorated_type =
typename MOTHER::decorated_type;
346 Cost(
const decorated_type& val) : MOTHER(val), vq3_cost() {}
347 Cost& operator=(
const decorated_type& val) {this->vq3_value = val;}
351 template<
typename MOTHER,
typename COST_TYPE>
353 using decorated_type = MOTHER;
358 Cost(
const decorated_type& val) : vq3_value(val), vq3_cost() {}
359 Cost& operator=(
const decorated_type& val) {vq3_value = val;}
363 template<
typename MOTHER,
typename COST_TYPE>
365 using decorated_type = MOTHER;
367 Cost() : MOTHER(), vq3_cost() {}
372 template<
typename COST_TYPE>
374 using decorated_type = void;
376 Cost() : vq3_cost() {}
380 template<
typename MOTHER,
typename COST_TYPE>
390 template<
typename MOTHER,
typename KIND>
392 using decorated_type =
typename MOTHER::decorated_type;
393 unsigned int vq3_label = 0;
396 Labelled(
const decorated_type& val) : MOTHER(val), vq3_label(0) {}
397 Labelled& operator=(
const decorated_type& val) {this->vq3_value = val;}
401 template<
typename MOTHER>
403 using decorated_type = MOTHER;
405 unsigned int vq3_label = 0;
408 Labelled(
const decorated_type& val) : vq3_value(val), vq3_label(0) {}
409 Labelled& operator=(
const decorated_type& val) {vq3_value = val;}
413 template<
typename MOTHER>
415 using decorated_type = MOTHER;
416 unsigned int vq3_label = 0;
417 Labelled() : MOTHER(), vq3_label(0) {}
424 using decorated_type = void;
425 unsigned int vq3_label = 0;
430 template<
typename MOTHER>
440 template<
typename MOTHER,
typename KIND>
442 using decorated_type =
typename MOTHER::decorated_type;
443 bool vq3_efficient =
true;
446 Efficiency(
const decorated_type& val) : MOTHER(val), vq3_efficient(
true) {}
447 Efficiency& operator=(
const decorated_type& val) {this->vq3_value = val;}
451 template<
typename MOTHER>
453 using decorated_type = MOTHER;
455 bool vq3_efficient =
true;
458 Efficiency(
const decorated_type& val) : vq3_value(val), vq3_efficient(
true) {}
459 Efficiency& operator=(
const decorated_type& val) {vq3_value = val;}
463 template<
typename MOTHER>
465 using decorated_type = MOTHER;
466 bool vq3_efficient =
true;
467 Efficiency() : MOTHER(), vq3_efficient(
true) {}
474 using decorated_type = void;
475 bool vq3_efficient =
true;
480 template<
typename MOTHER>
491 template<
typename MOTHER,
typename KIND>
493 using decorated_type =
typename MOTHER::decorated_type;
494 std::string vq3_text;
497 Text(
const decorated_type& val) : MOTHER(val), vq3_text() {}
498 Text& operator=(
const decorated_type& val) {this->vq3_value = val;}
502 template<
typename MOTHER>
504 using decorated_type = MOTHER;
506 std::string vq3_text;
509 Text(
const decorated_type& val) : vq3_value(val), vq3_text() {}
510 Text& operator=(
const decorated_type& val) {vq3_value = val;}
514 template<
typename MOTHER>
516 using decorated_type = MOTHER;
517 std::string vq3_text;
518 Text() : MOTHER(), vq3_text() {}
525 using decorated_type = void;
526 std::string vq3_text;
527 Text() : vq3_text() {}
531 template<
typename MOTHER>
541 template<
typename MOTHER,
typename INCREMENTABLE,
typename KIND>
542 struct Sum :
public MOTHER {
543 using decorated_type =
typename MOTHER::decorated_type;
546 Sum(
const Sum&) =
default;
547 Sum(
const decorated_type& val) : MOTHER(val), vq3_sum() {}
548 Sum& operator=(
const decorated_type& val) {this->vq3_value = val;}
552 template<
typename MOTHER,
typename INCREMENTABLE>
554 using decorated_type = MOTHER;
558 Sum(
const Sum&) =
default;
559 Sum(
const decorated_type& val) : vq3_value(val), vq3_sum() {}
560 Sum& operator=(
const decorated_type& val) {vq3_value = val;}
564 template<
typename MOTHER,
typename INCREMENTABLE>
566 using decorated_type = MOTHER;
568 Sum() : MOTHER(), vq3_sum() {}
569 Sum(
const Sum&) =
default;
573 template<
typename INCREMENTABLE>
575 using decorated_type = void;
578 Sum(
const Sum&) =
default;
581 template<
typename MOTHER,
typename INCREMENTABLE>
591 template<
typename MOTHER,
typename KIND>
593 using decorated_type =
typename MOTHER::decorated_type;
594 std::pair<unsigned int, unsigned int> vq3_gridpos = {0, 0};
597 GridPos(
const decorated_type& val) : MOTHER(val), vq3_gridpos({0, 0}) {}
598 GridPos& operator=(
const decorated_type& val) {this->vq3_value = val;}
602 template<
typename MOTHER>
604 using decorated_type = MOTHER;
606 std::pair<unsigned int, unsigned int> vq3_gridpos = {0, 0};
609 GridPos(
const decorated_type& val) : vq3_value(val), vq3_gridpos({0, 0}) {}
610 GridPos& operator=(
const decorated_type& val) {vq3_value = val;}
614 template<
typename MOTHER>
616 using decorated_type = MOTHER;
617 std::pair<unsigned int, unsigned int> vq3_gridpos = {0, 0};
618 GridPos() : MOTHER(), vq3_gridpos({0, 0}) {}
625 using decorated_type = void;
626 std::pair<unsigned int, unsigned int> vq3_gridpos = {0, 0};
627 GridPos() : vq3_gridpos({0, 0}) {}
631 template<
typename MOTHER>
645 template<
typename MOTHER,
typename VALUE,
unsigned int SAVITZKY_GOLAY_ORDER,
unsigned int SAVITZKY_GOLAY_WINDOW_SIZE,
unsigned int SAVITZKY_GOLAY_DEGREE,
typename KIND>
647 using decorated_type =
typename MOTHER::decorated_type;
651 Smoother(
const decorated_type& val) : MOTHER(val), vq3_smoother() {}
652 Smoother& operator=(
const decorated_type& val) {this->vq3_value = val;}
656 template<
typename MOTHER,
typename VALUE,
unsigned int SAVITZKY_GOLAY_ORDER,
unsigned int SAVITZKY_GOLAY_WINDOW_SIZE,
unsigned int SAVITZKY_GOLAY_DEGREE>
657 struct Smoother<MOTHER, VALUE, SAVITZKY_GOLAY_ORDER, SAVITZKY_GOLAY_WINDOW_SIZE, SAVITZKY_GOLAY_DEGREE,
not_decorated> {
658 using decorated_type = MOTHER;
663 Smoother(
const decorated_type& val) : vq3_value(val), vq3_smoother() {}
664 Smoother& operator=(
const decorated_type& val) {vq3_value = val;}
668 template<
typename MOTHER,
typename VALUE,
unsigned int SAVITZKY_GOLAY_ORDER,
unsigned int SAVITZKY_GOLAY_WINDOW_SIZE,
unsigned int SAVITZKY_GOLAY_DEGREE>
670 using decorated_type = MOTHER;
672 Smoother() : MOTHER(), vq3_smoother() {}
677 template<
typename VALUE,
unsigned int SAVITZKY_GOLAY_ORDER,
unsigned int SAVITZKY_GOLAY_WINDOW_SIZE,
unsigned int SAVITZKY_GOLAY_DEGREE>
678 struct Smoother<void, VALUE, SAVITZKY_GOLAY_ORDER, SAVITZKY_GOLAY_WINDOW_SIZE, SAVITZKY_GOLAY_DEGREE,
not_decorated> {
679 using decorated_type = void;
685 template<
typename MOTHER,
typename VALUE,
unsigned int SAVITZKY_GOLAY_ORDER,
unsigned int SAVITZKY_GOLAY_WINDOW_SIZE,
unsigned int SAVITZKY_GOLAY_DEGREE>
695 template<
typename MOTHER,
typename CUSTOM_TYPE,
typename KIND>
697 using decorated_type =
typename MOTHER::decorated_type;
698 CUSTOM_TYPE vq3_custom;
701 Custom(
const decorated_type& val) : MOTHER(val), vq3_custom() {}
702 Custom& operator=(
const decorated_type& val) {this->vq3_value = val;}
706 template<
typename MOTHER,
typename CUSTOM_TYPE>
708 using decorated_type = MOTHER;
710 CUSTOM_TYPE vq3_custom;
713 Custom(
const decorated_type& val) : vq3_value(val), vq3_custom() {}
714 Custom& operator=(
const decorated_type& val) {vq3_value = val;}
718 template<
typename MOTHER,
typename CUSTOM_TYPE>
720 using decorated_type = MOTHER;
721 CUSTOM_TYPE vq3_custom;
722 Custom() : MOTHER(), vq3_custom() {}
727 template<
typename CUSTOM_TYPE>
729 using decorated_type = void;
730 CUSTOM_TYPE vq3_custom;
731 Custom() : vq3_custom() {}
735 template<
typename MOTHER,
typename CUSTOM_TYPE>
739 namespace decorator {
748 template<
typename MOTHER,
typename VALUE,
typename ONLINE_PARAM,
typename KIND>
750 using decorated_type =
typename MOTHER::decorated_type;
754 MeanStd(
const decorated_type& val) : MOTHER(val), vq3_online_mean_std() {}
755 MeanStd& operator=(
const decorated_type& val) {this->vq3_value = val;}
759 template<
typename MOTHER,
typename VALUE,
typename ONLINE_PARAM>
761 using decorated_type = MOTHER;
766 MeanStd(
const decorated_type& val) : vq3_value(val), vq3_online_mean_std() {}
767 MeanStd& operator=(
const decorated_type& val) {vq3_value = val;}
771 template<
typename MOTHER,
typename VALUE,
typename ONLINE_PARAM>
773 using decorated_type = MOTHER;
775 MeanStd() : MOTHER(), vq3_online_mean_std() {}
780 template<
typename VALUE,
typename ONLINE_PARAM>
782 using decorated_type = void;
784 MeanStd() : vq3_online_mean_std() {}
788 template<
typename MOTHER,
typename VALUE,
typename ONLINE_PARAM>