2 #ifndef OPENGM_METAPROGRAMMING
3 #define OPENGM_METAPROGRAMMING
11 #define OPENGM_TYPELIST_1(T1) \
12 ::opengm::meta::TypeList<T1, opengm::meta::ListEnd >
14 #define OPENGM_TYPELIST_2(T1, T2) \
15 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_1(T2) >
17 #define OPENGM_TYPELIST_3(T1, T2, T3) \
18 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_2(T2, T3) >
20 #define OPENGM_TYPELIST_4(T1, T2, T3, T4) \
21 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_3(T2, T3, T4) >
23 #define OPENGM_TYPELIST_5(T1, T2, T3, T4, T5) \
24 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_4(T2, T3, T4, T5) >
26 #define OPENGM_TYPELIST_6(T1, T2, T3, T4, T5, T6) \
27 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_5(T2, T3, T4, T5, T6) >
29 #define OPENGM_TYPELIST_7(T1, T2, T3, T4, T5, T6, T7) \
30 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_6(T2, T3, T4, T5, T6, T7) >
32 #define OPENGM_TYPELIST_8(T1, T2, T3, T4, T5, T6, T7, T8) \
33 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_7(T2, T3, T4, T5, T6, T7, T8) >
35 #define OPENGM_TYPELIST_9(T1, T2, T3, T4, T5, T6, T7, T8, T9) \
36 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_8(T2, T3, T4, T5, T6, T7, T8, T9) >
38 #define OPENGM_TYPELIST_10(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) \
39 ::opengm::meta::TypeList<T1, OPENGM_TYPELIST_9(T2, T3, T4, T5, T6, T7, T8, T9, T10) >
47 template<
class T,
class I,
class L>
48 class IndependentFactor;
49 template <
class LINEAR_CONSTRAINT_FUNCTION_TYPE>
50 class LinearConstraintFunctionBase;
51 template <
class LINEAR_CONSTRAINT_FUNCTION_TYPE>
52 class LinearConstraintFunctionTraits;
57 template<
template <
typename >
class TO_BIND >
59 template<
class BIND_ARG_0>
61 typedef TO_BIND<BIND_ARG_0> type;
65 template<
template <
typename ,
typename >
class TO_BIND >
67 template<
class BIND_ARG_0,
class BIND_ARG_1>
69 typedef TO_BIND<BIND_ARG_0, BIND_ARG_1> type;
73 template<
template <
typename ,
typename,
typename >
class TO_BIND >
75 template<
class BIND_ARG_0,
class BIND_ARG_1,
class BIND_ARG_2>
77 typedef TO_BIND<BIND_ARG_0, BIND_ARG_1, BIND_ARG_2> type;
87 struct ApplyMetaFunction {
88 typedef typename T::type type;
127 typedef meta::True type;
135 typedef meta::False type;
154 template <
bool T_BOOL>
struct Bool;
156 template < >
struct Bool < true > : meta::TrueCase {
159 template < >
struct Bool < false > : meta::FalseCase {
162 template<
bool T_BOOL_A,
bool T_BOOL_B>
165 template < >
struct Or < true, true > : meta::TrueCase {
168 template < >
struct Or < true, false > : meta::TrueCase {
171 template < >
struct Or < false, true > : meta::TrueCase {
174 template < >
struct Or < false, false > : meta::FalseCase {
177 template<
bool T_BOOL>
181 struct Not<true> : meta::FalseCase {
185 struct Not<false> : meta::TrueCase {
188 template<
bool T_BOOL_A,
bool T_BOOL_B>
191 template < >
struct And < true, true > : meta::TrueCase {
194 template < >
struct And < true, false > : meta::FalseCase {
197 template < >
struct And < false, true > : meta::FalseCase {
200 template < >
struct And < false, false > : meta::FalseCase {
203 template<
bool T_Bool,
class T_True,
class T_False>
206 template<
class T_True,
class T_False>
207 struct If < true, T_True, T_False> {
211 template<
class T_True,
class T_False>
212 struct If < false, T_True, T_False> {
213 typedef T_False type;
216 template<
bool T_Bool,
class MetaFunctionTrue,
class MetaFunctionFalse>
217 struct EvalIf :
public meta::If<T_Bool, MetaFunctionTrue, MetaFunctionFalse>::type {
222 typedef SizeT< I-1 > type;
230 typedef SizeT< I+1 > type;
236 #define OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO(OPERATOR_SYMBOL,CLASS_NAME,RETURN_CLASS_TYPE) \
237 template<size_t A,size_t B> \
239 typedef typename Bool< (A OPERATOR_SYMBOL B) >::type type; \
241 value=RETURN_CLASS_TYPE < (A OPERATOR_SYMBOL B) >::value \
246 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( + , Plus , meta::SizeT );
248 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( - , Minus , meta::SizeT );
250 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( * , Multiplies , meta::SizeT );
252 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( == , EqualNumber , meta::Bool );
254 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( > , BiggerNumber , meta::Bool );
256 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( >= , BiggerOrEqualNumber , meta::Bool );
258 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( < , SmallerNumber , meta::Bool );
260 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( <= , SmallerOrEqualNumber , meta::Bool );
262 template<
size_t A,
size_t B>
263 struct MinimumNumber{
266 SmallerNumber<A,B>::value,
274 template<
class T,
class U>
275 struct Compare : FalseCase {
279 struct Compare<T, T> : TrueCase {
288 struct IsInvalidType: opengm::meta::FalseCase {
292 struct IsInvalidType< InvalidType< T > > : opengm::meta::TrueCase {
297 struct IsFactor : meta::FalseCase {
301 struct IsFactor<opengm::Factor<T> > : opengm::meta::TrueCase {
306 struct IsIndependentFactor : opengm::meta::FalseCase {
309 template<
class T,
class I,
class L>
310 struct IsIndependentFactor<opengm::IndependentFactor<T,I,L> > : opengm::meta::TrueCase {
313 template<
class T>
struct IsVoid : meta::FalseCase {
316 template< >
struct IsVoid<void> : meta::TrueCase {
319 template<
class T>
struct IsReference : meta::FalseCase {
322 template<
class T>
struct IsReference<const T &> : meta::FalseCase {
325 template<
class T>
struct IsReference<T&> : meta::TrueCase {
328 template<
class T>
struct IsConstReference : meta::FalseCase {
331 template<
class T>
struct IsConstReference< T &> : meta::FalseCase {
334 template<
class T>
struct IsConstReference<const T&> : meta::TrueCase {
337 template <
typename T>
338 struct RemoveReference {
342 template <
typename T>
343 struct RemoveReference<T&> {
347 template <
typename T>
352 template <
typename T>
353 struct RemoveConst<const T> {
357 template<
class T>
struct AddReference {
358 typedef typename meta::If <
360 meta::IsReference<T>::value,
361 meta::IsConstReference<T>::value
368 template<
class T>
struct AddConstReference {
369 typedef typename meta::If
371 meta::IsConstReference<T>::value,
374 meta::IsReference<T>::value,
375 typename meta::RemoveReference<T>::type
const &,
381 template<
class T_List>
382 struct LengthOfTypeList {
383 typedef meta::Int < 1 + LengthOfTypeList<typename T_List::TailType>::type::value> type;
390 struct LengthOfTypeList<meta::ListEnd> {
391 typedef meta::Int < 0 > type;
398 template<
class T_List,
unsigned int Index>
399 struct TypeAtTypeList {
400 typedef typename TypeAtTypeList<
typename T_List::TailType, Index - 1 > ::type type;
403 template<
class T_List>
404 struct TypeAtTypeList<T_List, 0 > {
405 typedef typename T_List::HeadType type;
408 template<
class T_List,
unsigned int Index,
class T_DefaultType>
409 struct TypeAtTypeListSave
411 meta::LengthOfTypeList<T_List>::value >= Index ? true : false,
412 meta::TypeAtTypeList<T_List, Index>,
413 meta::Self<T_DefaultType>
418 template<
class T_Head,
class T_Tail>
420 typedef meta::ListEnd ListEnd;
421 typedef T_Head HeadType;
422 typedef T_Tail TailType;
428 class T2 = opengm::meta::ListEnd,
429 class T3 = opengm::meta::ListEnd,
430 class T4 = opengm::meta::ListEnd,
431 class T5 = opengm::meta::ListEnd,
432 class T6 = opengm::meta::ListEnd,
433 class T7 = opengm::meta::ListEnd,
434 class T8 = opengm::meta::ListEnd,
435 class T9 = opengm::meta::ListEnd,
436 class T10 = opengm::meta::ListEnd,
437 class T11 = opengm::meta::ListEnd,
438 class T12 = opengm::meta::ListEnd,
439 class T13 = opengm::meta::ListEnd,
440 class T14 = opengm::meta::ListEnd,
441 class T15 = opengm::meta::ListEnd
443 struct TypeListGenerator {
444 typedef opengm::meta::TypeList<T1, typename TypeListGenerator<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::type > type;
448 struct TypeListGenerator<opengm::meta::ListEnd> {
449 typedef opengm::meta::ListEnd type;
453 template<
bool B_IsTrue,
class T_TrueType>
455 typedef T_TrueType type;
457 struct Case : opengm::meta::Bool<B_IsTrue> {
462 template <
class T_List,
class T_DefaultCase = opengm::meta::EmptyType >
464 typedef typename opengm::meta::EvalIf
466 opengm::meta::TypeAtTypeList<T_List, 0 > ::type::Case::value,
467 typename opengm::meta::TypeAtTypeList<T_List, 0 >::type,
468 Switch<typename T_List::TailType, T_DefaultCase>
472 template<
class T_DefaultCase>
473 struct Switch<opengm::meta::ListEnd, T_DefaultCase> {
474 typedef T_DefaultCase type;
477 template<
class T>
struct IsPtr : opengm::meta::FalseCase {
480 template<
class T>
struct IsPtr<T *
const> : opengm::meta::FalseCase {
483 template<
class T>
struct IsPtr<T * > : opengm::meta::TrueCase {
486 template<
class T>
struct IsConstPtr : opengm::meta::FalseCase {
489 template<
class T>
struct IsConstPtr<T * > : opengm::meta::FalseCase {
492 template<
class T>
struct IsConstPtr<T *
const > : opengm::meta::TrueCase {
495 template<
class T>
struct IsConst : opengm::meta::FalseCase {
498 template<
class T>
struct IsConst< const T> : opengm::meta::TrueCase {
502 struct IsFundamental {
503 typedef typename opengm::meta::Or <
504 std::numeric_limits< typename RemoveConst<T>::type >::is_specialized,
505 opengm::meta::IsVoid< typename RemoveConst<T>::type >::value
514 struct IsFloatingPoint :
516 opengm::meta::Compare<T, float >::value ||
517 opengm::meta::Compare<T, const float >::value ||
518 opengm::meta::Compare<T, double >::value ||
519 opengm::meta::Compare<T, const double >::value ||
520 opengm::meta::Compare<T, long double >::value ||
521 opengm::meta::Compare<T, const long double >::value
528 struct IsFundamental : opengm::meta::IsFundamental<T> {
531 struct IsFloatingPoint : opengm::meta::IsFloatingPoint<T> {
534 struct IsConst : opengm::meta::IsConst<T> {
537 struct IsConstReference : opengm::meta::IsConstReference<T> {
540 struct IsReference : opengm::meta::IsReference<T> {
543 struct IsPtr : opengm::meta::IsPtr<T> {
546 struct IsConstPtr : opengm::meta::IsConstPtr<T> {
551 struct IsTypeList : meta::FalseCase{};
553 template<
class TH,
class TT>
554 struct IsTypeList< meta::TypeList<TH,TT> > : meta::TrueCase{};
557 struct TypeListFromMaybeTypeList{
558 typedef meta::TypeList<T,meta::ListEnd> type;
561 template<
class TH,
class TT>
562 struct TypeListFromMaybeTypeList< meta::TypeList<TH,TT> > {
563 typedef meta::TypeList<TH,TT> type;
566 template<
class TL,
class FrontType>
568 typedef meta::TypeList<FrontType,TL> type;
571 template<
class TL,
class TYPE>
574 template<
class THEAD,
class TTAIL,
class TYPE>
575 struct BackInsert<TypeList<THEAD,TTAIL> ,TYPE>{
578 typename meta::BackInsert<
586 struct BackInsert<ListEnd,TYPE>{
587 typedef meta::TypeList<TYPE,ListEnd> type;
590 template<
class TL,
class TypeToFindx>
591 struct GetIndexInTypeList;
593 template<
class THEAD,
class TTAIL,
class TypeToFind>
594 struct GetIndexInTypeList<meta::TypeList<THEAD,TTAIL>,TypeToFind>{
596 value=GetIndexInTypeList<TTAIL,TypeToFind >::value+1
598 typedef meta::SizeT<GetIndexInTypeList<TTAIL,TypeToFind >::type::value +1> type;
601 template<
class THEAD,
class TTAIL>
602 struct GetIndexInTypeList<meta::TypeList<THEAD,TTAIL>,THEAD >{
606 typedef meta::SizeT<0> type;
609 template<
class TL,
class TypeToFindx,
size_t NOT_FOUND_INDEX>
610 struct GetIndexInTypeListSafely;
612 template<
class THEAD,
class TTAIL,
class TypeToFind,
size_t NOT_FOUND_INDEX>
613 struct GetIndexInTypeListSafely<meta::TypeList<THEAD,TTAIL>,TypeToFind,NOT_FOUND_INDEX>{
615 value=GetIndexInTypeListSafely<TTAIL,TypeToFind,NOT_FOUND_INDEX >::value+1
617 typedef meta::SizeT<GetIndexInTypeListSafely<TTAIL,TypeToFind,NOT_FOUND_INDEX >::type::value +1> type;
620 template<
class THEAD,
class TTAIL,
size_t NOT_FOUND_INDEX>
621 struct GetIndexInTypeListSafely<meta::TypeList<THEAD,TTAIL>,THEAD,NOT_FOUND_INDEX >{
625 typedef meta::SizeT<0> type;
628 template<
class TYPE_TO_FIND,
size_t NOT_FOUND_INDEX>
629 struct GetIndexInTypeListSafely<meta::ListEnd,TYPE_TO_FIND,NOT_FOUND_INDEX >{
631 value=NOT_FOUND_INDEX
633 typedef meta::SizeT<NOT_FOUND_INDEX> type;
636 template <
class TL,
class T>
637 struct DeleteTypeInTypeList;
640 struct DeleteTypeInTypeList<ListEnd,T> {
641 typedef ListEnd type;
644 template <
class T,
class TTail>
645 struct DeleteTypeInTypeList<TypeList<T,TTail>,T> {
649 template <
class THead,
class TTail,
class T>
650 struct DeleteTypeInTypeList<TypeList<THead,TTail>,T> {
651 typedef TypeList<THead, typename DeleteTypeInTypeList<TTail,T>::type> type;
654 template<
class TL,
class TypeToFindx>
655 struct HasTypeInTypeList;
657 template<
class THEAD,
class TTAIL,
class TypeToFind>
658 struct HasTypeInTypeList<meta::TypeList<THEAD,TTAIL>,TypeToFind>
661 value=HasTypeInTypeList<TTAIL,TypeToFind >::value
663 typedef HasTypeInTypeList< TTAIL,TypeToFind> type;
667 template<
class TL,
class TSL,
size_t SIZE,
class NOT_FOUND>
668 struct FindSizedType;
670 template<
class TLH,
class TLT,
class TSLH,
class TSLT,
size_t SIZE,
class NOT_FOUND>
671 struct FindSizedType<meta::TypeList<TLH,TLT>,meta::TypeList<TSLH,TSLT>,SIZE,NOT_FOUND>{
672 typedef typename FindSizedType<TLT,TSLT,SIZE,NOT_FOUND >::type type;
675 template<
class TLH ,
class TLT,
class TSLT,
size_t SIZE,
class NOT_FOUND>
676 struct FindSizedType< meta::TypeList<TLH,TLT>,meta::TypeList< meta::SizeT<SIZE> ,TSLT>,SIZE,NOT_FOUND >{
680 template<
size_t SIZE,
class NOT_FOUND>
681 struct FindSizedType< meta::ListEnd,meta::ListEnd,SIZE,NOT_FOUND >{
682 typedef NOT_FOUND type;
685 template<
class TL,
class OTHER_TL>
686 struct MergeTypeLists;
688 template<
class THEAD,
class TTAIL,
class OTHER_TL>
689 struct MergeTypeLists<meta::TypeList<THEAD,TTAIL>,OTHER_TL>
691 typedef meta::TypeList<
693 typename MergeTypeLists<TTAIL,OTHER_TL>::type
697 template<
class OTHER_TL>
698 struct MergeTypeLists<meta::ListEnd,OTHER_TL>
700 typedef OTHER_TL type;
703 template<
class THEAD,
class TTAIL>
704 struct HasTypeInTypeList<meta::TypeList<THEAD,TTAIL>,THEAD > : meta::TrueCase{
707 template<
class TypeToFindx>
708 struct HasTypeInTypeList<meta::ListEnd,TypeToFindx> : meta::FalseCase{
714 template<
class TL,
class TYPE>
715 struct InsertInTypeListOrMoveToEnd{
716 typedef typename meta::If<
717 meta::HasTypeInTypeList<
721 typename meta::BackInsert<
722 typename DeleteTypeInTypeList< TL,TYPE >::type,
725 typename meta::BackInsert<
732 template<
class TL,
class OTHER_TL>
733 struct MergeTypeListsWithoutDups;
735 template<
class TL,
class THEAD,
class TTAIL>
736 struct MergeTypeListsWithoutDups<TL, meta::TypeList<THEAD, TTAIL> > {
737 typedef typename MergeTypeListsWithoutDups<
738 typename meta::InsertInTypeListOrMoveToEnd<TL, THEAD>::type,
744 struct MergeTypeListsWithoutDups<TL, meta::ListEnd> {
749 struct HasDuplicatesInTypeList;
751 template<
class THEAD,
class TTAIL>
752 struct HasDuplicatesInTypeList<meta::TypeList<THEAD,TTAIL> >{
753 typedef typename meta::EvalIf<
754 HasTypeInTypeList<TTAIL,THEAD>::value,
756 HasDuplicatesInTypeList< TTAIL>
760 value= HasDuplicatesInTypeList<meta::TypeList<THEAD,TTAIL> >::type::value
765 struct HasDuplicatesInTypeList<meta::ListEnd> : meta::FalseCase{
768 template<
class MAYBE_TYPELIST,
class EXPLICIT_FUNCTION_TYPE,
bool EDITABLE>
769 struct GenerateFunctionTypeList{
770 typedef typename meta::TypeListFromMaybeTypeList<MAYBE_TYPELIST>::type StartTypeList;
771 typedef typename meta::If<
773 typename InsertInTypeListOrMoveToEnd<StartTypeList,EXPLICIT_FUNCTION_TYPE>::type,
782 typedef T value_type;
783 typedef typename opengm::meta::AddReference<T>::type reference;
784 typedef typename opengm::meta::AddConstReference<T>::type const_reference;
785 typedef typename opengm::meta::If <
786 opengm::meta::TypeInfo<T>::IsFundamental::value,
787 typename opengm::meta::RemoveConst<T>::type
const,
788 typename opengm::meta::AddConstReference<T>::type
793 template<
class TList ,
template <
class>
class InstanceUnitType,
class TListSrc>
795 template<
class ListHead,
class ListTail,
template <
class>
class InstanceUnitType,
class TListSrc>
796 class FieldHelper< opengm::meta::TypeList<ListHead,ListTail> ,InstanceUnitType,TListSrc>
797 :
public FieldHelper<ListHead,InstanceUnitType,TListSrc>,
798 public FieldHelper<ListTail,InstanceUnitType,TListSrc>{
800 template<
class ListTail ,
template <
class>
class InstanceUnitType,
class TListSrc>
802 :
public InstanceUnitType<ListTail>{
804 template<
template <
class>
class InstanceUnitType,
class TListSrc>
805 class FieldHelper<opengm::meta::ListEnd,InstanceUnitType,TListSrc>{
808 template<
class TList ,
template <
class>
class InstanceUnitType>
810 :
public FieldHelper<TList,InstanceUnitType,TList>{
813 template <
typename T>
815 typedef InstanceUnitType<T> type;
817 template <
size_t Index>
818 struct RebingByIndex{
819 typedef InstanceUnitType<typename TypeAtTypeList<TList,Index>::type > type;
823 template<
class TList ,
class TYPE2,
template <
class ,
class >
class InstanceUnitType,
class TListSrc>
826 template<
class ListHead,
class ListTail,
class TYPE2,
template <
class,
class>
class InstanceUnitType,
class TListSrc>
827 class Field2Helper< opengm::meta::TypeList<ListHead,ListTail> ,TYPE2,InstanceUnitType,TListSrc>
828 :
public Field2Helper<ListHead,TYPE2,InstanceUnitType,TListSrc>,
829 public Field2Helper<ListTail,TYPE2,InstanceUnitType,TListSrc>{
832 template<
class ListTail ,
class TYPE2,
template <
class,
class>
class InstanceUnitType,
class TListSrc>
834 :
public InstanceUnitType<ListTail,TYPE2>{
837 template<
class TYPE2,
template <
class,
class>
class InstanceUnitType,
class TListSrc>
838 class Field2Helper<opengm::meta::ListEnd,TYPE2,InstanceUnitType,TListSrc>{
841 template<
class TList,
class TYPE2 ,
template <
class,
class>
class InstanceUnitType>
844 public Field2Helper<TList,TYPE2,InstanceUnitType,TList>{
847 template <
typename T>
849 typedef InstanceUnitType<T,TYPE2> type;
851 template <
size_t Index>
852 struct RebingByIndex{
853 typedef InstanceUnitType<typename TypeAtTypeList<TList,Index>::type,TYPE2 > type;
858 template<
size_t Index,
class IG>
859 static inline typename IG::template RebingByIndex<Index>::type &
862 IG & instanceGenerator
864 return instanceGenerator;
867 template<
size_t Index,
class IG>
868 static inline const typename IG::template RebingByIndex<Index>::type &
871 const IG & instanceGenerator
873 return instanceGenerator;
876 template<
class T,
class IG>
877 static inline typename IG::template RebingByType<T>::type &
880 IG & instanceGenerator
882 return instanceGenerator;
885 template<
class T,
class IG>
886 static inline const typename IG::template RebingByType<T>::type &
889 const IG & instanceGenerator
891 return instanceGenerator;
895 template<
class Factor,
size_t FunctionIndex>
896 class GetFunctionFromFactor
900 typedef typename meta::TypeAtTypeList<FunctionTypeList,FunctionIndex>::type FunctionType;
901 static inline const FunctionType &
get(
const Factor & factor) {
902 return factor.
template function<FunctionIndex>();
904 static inline FunctionType &
get( Factor & factor) {
905 return factor.
template function<FunctionIndex>();
909 template<
class Factor,
size_t FunctionIndex>
912 template<
class T,
size_t FunctionIndex>
913 class GetFunction<opengm::Factor<T>,FunctionIndex >{
914 typedef typename Factor<T>::FunctionTypeList FunctionTypeList;
916 typedef typename meta::TypeAtTypeList<FunctionTypeList,FunctionIndex>::type FunctionType;
918 static inline const FunctionType &
get(
const Factor<T> & factor) {
919 return factor.
template function<FunctionIndex>();
921 static inline FunctionType &
get(Factor<T> & factor) {
922 return factor.
template function<FunctionIndex>();
926 template<
class T,
class I,
class L,
size_t FunctionIndex>
927 class GetFunction<IndependentFactor<T,I,L>,FunctionIndex >{
929 typedef typename IndependentFactor<T,I,L>::FunctionType FunctionType;
930 static inline const FunctionType &
get(
const IndependentFactor<T,I,L> & factor) {
931 return factor.template function<0>();
933 static inline FunctionType &
get(IndependentFactor<T,I,L> & factor) {
934 return factor.template function<0>();
938 template<
class Factor>
939 class GetFunctionTypeIndex;
942 class GetFunctionTypeIndex<opengm::Factor<T> >{
945 return factor.functionType();
948 return factor.functionType();
952 template<
class T,
class I,
class L>
953 class GetFunctionTypeIndex<opengm::IndependentFactor<T,I,L> >{
964 class IsField : opengm::meta::FalseCase{};
966 template<
class TList ,
template <
class>
class InstanceUnitType>
967 class IsField< meta::Field<TList,InstanceUnitType> > : opengm::meta::TrueCase{};
970 struct WRONG_FUNCTION_TYPE;
974 struct OPENGM_METAPROGRAMMING_COMPILE_TIME_ASSERTION_FAILED_;
976 struct OPENGM_METAPROGRAMMING_COMPILE_TIME_ASSERTION_FAILED_<meta::EmptyType >{
985 template<
class TLIST,
size_t INITIAL_VALUE,
template <
size_t,
size_t>
class ACCUMULATOR>
988 template<
class TLIST_HEAD,
class TLIST_TAIL,
size_t INITIAL_VALUE,
template <
size_t,
size_t>
class ACCUMULATOR>
989 class Accumulate<meta::TypeList<TLIST_HEAD,TLIST_TAIL>,INITIAL_VALUE ,ACCUMULATOR >{
1012 template<
size_t INITIAL_VALUE,
template <
size_t,
size_t>
class ACCUMULATOR>
1013 class Accumulate<meta::ListEnd,INITIAL_VALUE ,ACCUMULATOR >{
1017 typedef SizeT<INITIAL_VALUE> type;
1021 struct PromoteToFloatingPoint{
1022 typedef typename meta::If<
1023 meta::IsFloatingPoint<T>::value ,
1030 template <
class BASE,
class DERIVED>
1032 typedef char yes[1];
1035 static yes& test(BASE*);
1036 static no& test(...);
1038 static DERIVED*
get(void);
1041 value = (
sizeof(test(
get())) ==
sizeof(yes))
1047 struct IsCompleteType {
1048 typedef char yes[1];
1052 static yes& test(
int(*)[
sizeof(T1)]);
1054 static no& test(...);
1057 value = (
sizeof(test<T>(0)) ==
sizeof(yes))
1065 struct GetLinearConstraintFunctionTypeList;
1068 template<
class THEAD,
class TTAIL>
1069 struct GetLinearConstraintFunctionTypeList<TypeList<THEAD,TTAIL> > {
1070 typedef TypeList<THEAD, typename GetLinearConstraintFunctionTypeList<TTAIL>::type > true_type;
1071 typedef typename TypeListFromMaybeTypeList<typename GetLinearConstraintFunctionTypeList<TTAIL>::type>::type false_type;
1073 template <
class FUNCTION,
bool IS_COMPLETE_TYPE>
1074 struct IsLinearConstraintFunction {
1075 typedef false_type type;
1078 template <
class FUNCTION>
1079 struct IsLinearConstraintFunction<FUNCTION, true> {
1080 typedef typename If<IsBaseOf<opengm::LinearConstraintFunctionBase<FUNCTION>, FUNCTION>::value, true_type, false_type>::type type;
1082 typedef IsCompleteType<opengm::LinearConstraintFunctionTraits<THEAD> > IsCompleteLinearConstraintFunction;
1084 typedef typename IsLinearConstraintFunction<THEAD, IsCompleteLinearConstraintFunction::value>::type type;
1089 struct GetLinearConstraintFunctionTypeList<ListEnd> {
1090 typedef ListEnd type;
1107 class T2 = meta::ListEnd,
1108 class T3 = meta::ListEnd,
1109 class T4 = meta::ListEnd,
1110 class T5 = meta::ListEnd,
1111 class T6 = meta::ListEnd,
1112 class T7 = meta::ListEnd,
1113 class T8 = meta::ListEnd,
1114 class T9 = meta::ListEnd,
1115 class T10 = meta::ListEnd,
1116 class T11 = meta::ListEnd,
1117 class T12 = meta::ListEnd,
1118 class T13 = meta::ListEnd,
1119 class T14 = meta::ListEnd,
1120 class T15 = meta::ListEnd
1122 struct FunctionTypeListGenerator {
1123 typedef meta::TypeList<T1, typename FunctionTypeListGenerator<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::type > type;
1127 struct FunctionTypeListGenerator<meta::ListEnd> {
1128 typedef meta::ListEnd type;
1135 #endif // #ifndef OPENGM_METAPROGRAMMING
Factor (with corresponding function and variable indices), independent of a GraphicalModel.
GraphicalModelType::FunctionTypeList FunctionTypeList
Abstraction (wrapper class) of factors, independent of the function used to implement the factor...