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;
54 class LinearConstraintFunctionTraitsUndefined;
59 template<
template <
typename >
class TO_BIND >
61 template<
class BIND_ARG_0>
63 typedef TO_BIND<BIND_ARG_0> type;
67 template<
template <
typename ,
typename >
class TO_BIND >
69 template<
class BIND_ARG_0,
class BIND_ARG_1>
71 typedef TO_BIND<BIND_ARG_0, BIND_ARG_1> type;
75 template<
template <
typename ,
typename,
typename >
class TO_BIND >
77 template<
class BIND_ARG_0,
class BIND_ARG_1,
class BIND_ARG_2>
79 typedef TO_BIND<BIND_ARG_0, BIND_ARG_1, BIND_ARG_2> type;
89 struct ApplyMetaFunction {
90 typedef typename T::type type;
129 typedef meta::True type;
137 typedef meta::False type;
156 template <
bool T_BOOL>
struct Bool;
158 template < >
struct Bool < true > : meta::TrueCase {
161 template < >
struct Bool < false > : meta::FalseCase {
164 template<
bool T_BOOL_A,
bool T_BOOL_B>
167 template < >
struct Or < true, true > : meta::TrueCase {
170 template < >
struct Or < true, false > : meta::TrueCase {
173 template < >
struct Or < false, true > : meta::TrueCase {
176 template < >
struct Or < false, false > : meta::FalseCase {
179 template<
bool T_BOOL>
183 struct Not<true> : meta::FalseCase {
187 struct Not<false> : meta::TrueCase {
190 template<
bool T_BOOL_A,
bool T_BOOL_B>
193 template < >
struct And < true, true > : meta::TrueCase {
196 template < >
struct And < true, false > : meta::FalseCase {
199 template < >
struct And < false, true > : meta::FalseCase {
202 template < >
struct And < false, false > : meta::FalseCase {
205 template<
bool T_Bool,
class T_True,
class T_False>
208 template<
class T_True,
class T_False>
209 struct If < true, T_True, T_False> {
213 template<
class T_True,
class T_False>
214 struct If < false, T_True, T_False> {
215 typedef T_False type;
218 template<
bool T_Bool,
class MetaFunctionTrue,
class MetaFunctionFalse>
219 struct EvalIf :
public meta::If<T_Bool, MetaFunctionTrue, MetaFunctionFalse>::type {
224 typedef SizeT< I-1 > type;
232 typedef SizeT< I+1 > type;
238 #define OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO(OPERATOR_SYMBOL,CLASS_NAME,RETURN_CLASS_TYPE) \ 239 template<size_t A,size_t B> \ 241 typedef typename Bool< (A OPERATOR_SYMBOL B) >::type type; \ 243 value=RETURN_CLASS_TYPE < (A OPERATOR_SYMBOL B) >::value \ 248 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( + , Plus , meta::SizeT );
250 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( - , Minus , meta::SizeT );
252 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( * , Multiplies , meta::SizeT );
254 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( == , EqualNumber , meta::Bool );
256 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( > , BiggerNumber , meta::Bool );
258 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( >= , BiggerOrEqualNumber , meta::Bool );
260 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( < , SmallerNumber , meta::Bool );
262 OPENGM_METAPROGRAMMING_BINARY_OPERATOR_GENERATOR_MACRO( <= , SmallerOrEqualNumber , meta::Bool );
264 template<
size_t A,
size_t B>
265 struct MinimumNumber{
268 SmallerNumber<A,B>::value,
276 template<
class T,
class U>
277 struct Compare : FalseCase {
281 struct Compare<T, T> : TrueCase {
290 struct IsInvalidType: opengm::meta::FalseCase {
294 struct IsInvalidType< InvalidType< T > > : opengm::meta::TrueCase {
299 struct IsFactor : meta::FalseCase {
303 struct IsFactor<opengm::Factor<T> > : opengm::meta::TrueCase {
308 struct IsIndependentFactor : opengm::meta::FalseCase {
311 template<
class T,
class I,
class L>
312 struct IsIndependentFactor<opengm::IndependentFactor<T,I,L> > : opengm::meta::TrueCase {
315 template<
class T>
struct IsVoid : meta::FalseCase {
318 template< >
struct IsVoid<void> : meta::TrueCase {
321 template<
class T>
struct IsReference : meta::FalseCase {
324 template<
class T>
struct IsReference<const T &> : meta::FalseCase {
327 template<
class T>
struct IsReference<T&> : meta::TrueCase {
330 template<
class T>
struct IsConstReference : meta::FalseCase {
333 template<
class T>
struct IsConstReference< T &> : meta::FalseCase {
336 template<
class T>
struct IsConstReference<const T&> : meta::TrueCase {
339 template <
typename T>
340 struct RemoveReference {
344 template <
typename T>
345 struct RemoveReference<T&> {
349 template <
typename T>
354 template <
typename T>
355 struct RemoveConst<const T> {
359 template<
class T>
struct AddReference {
360 typedef typename meta::If <
362 meta::IsReference<T>::value,
363 meta::IsConstReference<T>::value
370 template<
class T>
struct AddConstReference {
371 typedef typename meta::If
373 meta::IsConstReference<T>::value,
376 meta::IsReference<T>::value,
377 typename meta::RemoveReference<T>::type
const &,
383 template<
class T_List>
384 struct LengthOfTypeList {
385 typedef meta::Int < 1 + LengthOfTypeList<typename T_List::TailType>::type::value> type;
392 struct LengthOfTypeList<meta::ListEnd> {
393 typedef meta::Int < 0 > type;
400 template<
class T_List,
unsigned int Index>
401 struct TypeAtTypeList {
402 typedef typename TypeAtTypeList<
typename T_List::TailType, Index - 1 > ::type type;
405 template<
class T_List>
406 struct TypeAtTypeList<T_List, 0 > {
407 typedef typename T_List::HeadType type;
410 template<
class T_List,
unsigned int Index,
class T_DefaultType>
411 struct TypeAtTypeListSave
413 meta::LengthOfTypeList<T_List>::value >= Index ? true : false,
414 meta::TypeAtTypeList<T_List, Index>,
415 meta::Self<T_DefaultType>
420 template<
class T_Head,
class T_Tail>
422 typedef meta::ListEnd ListEnd;
423 typedef T_Head HeadType;
424 typedef T_Tail TailType;
430 class T2 = opengm::meta::ListEnd,
431 class T3 = opengm::meta::ListEnd,
432 class T4 = opengm::meta::ListEnd,
433 class T5 = opengm::meta::ListEnd,
434 class T6 = opengm::meta::ListEnd,
435 class T7 = opengm::meta::ListEnd,
436 class T8 = opengm::meta::ListEnd,
437 class T9 = opengm::meta::ListEnd,
438 class T10 = opengm::meta::ListEnd,
439 class T11 = opengm::meta::ListEnd,
440 class T12 = opengm::meta::ListEnd,
441 class T13 = opengm::meta::ListEnd,
442 class T14 = opengm::meta::ListEnd,
443 class T15 = opengm::meta::ListEnd
445 struct TypeListGenerator {
446 typedef opengm::meta::TypeList<T1, typename TypeListGenerator<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::type > type;
450 struct TypeListGenerator<opengm::meta::ListEnd> {
451 typedef opengm::meta::ListEnd type;
455 template<
bool B_IsTrue,
class T_TrueType>
457 typedef T_TrueType type;
459 struct Case : opengm::meta::Bool<B_IsTrue> {
464 template <
class T_List,
class T_DefaultCase = opengm::meta::EmptyType >
466 typedef typename opengm::meta::EvalIf
468 opengm::meta::TypeAtTypeList<T_List, 0 > ::type::Case::value,
469 typename opengm::meta::TypeAtTypeList<T_List, 0 >::type,
470 Switch<typename T_List::TailType, T_DefaultCase>
474 template<
class T_DefaultCase>
475 struct Switch<opengm::meta::ListEnd, T_DefaultCase> {
476 typedef T_DefaultCase type;
479 template<
class T>
struct IsPtr : opengm::meta::FalseCase {
482 template<
class T>
struct IsPtr<T *
const> : opengm::meta::FalseCase {
485 template<
class T>
struct IsPtr<T * > : opengm::meta::TrueCase {
488 template<
class T>
struct IsConstPtr : opengm::meta::FalseCase {
491 template<
class T>
struct IsConstPtr<T * > : opengm::meta::FalseCase {
494 template<
class T>
struct IsConstPtr<T *
const > : opengm::meta::TrueCase {
497 template<
class T>
struct IsConst : opengm::meta::FalseCase {
500 template<
class T>
struct IsConst< const T> : opengm::meta::TrueCase {
504 struct IsFundamental {
505 typedef typename opengm::meta::Or <
506 std::numeric_limits< typename RemoveConst<T>::type >::is_specialized,
507 opengm::meta::IsVoid< typename RemoveConst<T>::type >::value
516 struct IsFloatingPoint :
518 opengm::meta::Compare<T, float >::value ||
519 opengm::meta::Compare<T, const float >::value ||
520 opengm::meta::Compare<T, double >::value ||
521 opengm::meta::Compare<T, const double >::value ||
522 opengm::meta::Compare<T, long double >::value ||
523 opengm::meta::Compare<T, const long double >::value
530 struct IsFundamental : opengm::meta::IsFundamental<T> {
533 struct IsFloatingPoint : opengm::meta::IsFloatingPoint<T> {
536 struct IsConst : opengm::meta::IsConst<T> {
539 struct IsConstReference : opengm::meta::IsConstReference<T> {
542 struct IsReference : opengm::meta::IsReference<T> {
545 struct IsPtr : opengm::meta::IsPtr<T> {
548 struct IsConstPtr : opengm::meta::IsConstPtr<T> {
553 struct IsTypeList : meta::FalseCase{};
555 template<
class TH,
class TT>
556 struct IsTypeList< meta::TypeList<TH,TT> > : meta::TrueCase{};
559 struct TypeListFromMaybeTypeList{
560 typedef meta::TypeList<T,meta::ListEnd> type;
563 template<
class TH,
class TT>
564 struct TypeListFromMaybeTypeList< meta::TypeList<TH,TT> > {
565 typedef meta::TypeList<TH,TT> type;
568 template<
class TL,
class FrontType>
570 typedef meta::TypeList<FrontType,TL> type;
573 template<
class TL,
class TYPE>
576 template<
class THEAD,
class TTAIL,
class TYPE>
577 struct BackInsert<TypeList<THEAD,TTAIL> ,TYPE>{
580 typename meta::BackInsert<
588 struct BackInsert<ListEnd,TYPE>{
589 typedef meta::TypeList<TYPE,ListEnd> type;
592 template<
class TL,
class TypeToFindx>
593 struct GetIndexInTypeList;
595 template<
class THEAD,
class TTAIL,
class TypeToFind>
596 struct GetIndexInTypeList<meta::TypeList<THEAD,TTAIL>,TypeToFind>{
598 value=GetIndexInTypeList<TTAIL,TypeToFind >::value+1
600 typedef meta::SizeT<GetIndexInTypeList<TTAIL,TypeToFind >::type::value +1> type;
603 template<
class THEAD,
class TTAIL>
604 struct GetIndexInTypeList<meta::TypeList<THEAD,TTAIL>,THEAD >{
608 typedef meta::SizeT<0> type;
611 template<
class TL,
class TypeToFindx,
size_t NOT_FOUND_INDEX>
612 struct GetIndexInTypeListSafely;
614 template<
class THEAD,
class TTAIL,
class TypeToFind,
size_t NOT_FOUND_INDEX>
615 struct GetIndexInTypeListSafely<meta::TypeList<THEAD,TTAIL>,TypeToFind,NOT_FOUND_INDEX>{
617 value=GetIndexInTypeListSafely<TTAIL,TypeToFind,NOT_FOUND_INDEX >::value+1
619 typedef meta::SizeT<GetIndexInTypeListSafely<TTAIL,TypeToFind,NOT_FOUND_INDEX >::type::value +1> type;
622 template<
class THEAD,
class TTAIL,
size_t NOT_FOUND_INDEX>
623 struct GetIndexInTypeListSafely<meta::TypeList<THEAD,TTAIL>,THEAD,NOT_FOUND_INDEX >{
627 typedef meta::SizeT<0> type;
630 template<
class TYPE_TO_FIND,
size_t NOT_FOUND_INDEX>
631 struct GetIndexInTypeListSafely<meta::ListEnd,TYPE_TO_FIND,NOT_FOUND_INDEX >{
633 value=NOT_FOUND_INDEX
635 typedef meta::SizeT<NOT_FOUND_INDEX> type;
638 template <
class TL,
class T>
639 struct DeleteTypeInTypeList;
642 struct DeleteTypeInTypeList<ListEnd,T> {
643 typedef ListEnd type;
646 template <
class T,
class TTail>
647 struct DeleteTypeInTypeList<TypeList<T,TTail>,T> {
651 template <
class THead,
class TTail,
class T>
652 struct DeleteTypeInTypeList<TypeList<THead,TTail>,T> {
653 typedef TypeList<THead, typename DeleteTypeInTypeList<TTail,T>::type> type;
656 template<
class TL,
class TypeToFindx>
657 struct HasTypeInTypeList;
659 template<
class THEAD,
class TTAIL,
class TypeToFind>
660 struct HasTypeInTypeList<meta::TypeList<THEAD,TTAIL>,TypeToFind>
663 value=HasTypeInTypeList<TTAIL,TypeToFind >::value
665 typedef HasTypeInTypeList< TTAIL,TypeToFind> type;
669 template<
class THEAD,
class TTAIL>
670 struct HasTypeInTypeList<meta::TypeList<THEAD,TTAIL>,THEAD > : meta::TrueCase{
673 template<
class TypeToFindx>
674 struct HasTypeInTypeList<meta::ListEnd,TypeToFindx> : meta::FalseCase{
678 template<
class TL,
class TSL,
size_t SIZE,
class NOT_FOUND>
679 struct FindSizedType;
681 template<
class TLH,
class TLT,
class TSLH,
class TSLT,
size_t SIZE,
class NOT_FOUND>
682 struct FindSizedType<meta::TypeList<TLH,TLT>,meta::TypeList<TSLH,TSLT>,SIZE,NOT_FOUND>{
683 typedef typename FindSizedType<TLT,TSLT,SIZE,NOT_FOUND >::type type;
686 template<
class TLH ,
class TLT,
class TSLT,
size_t SIZE,
class NOT_FOUND>
687 struct FindSizedType< meta::TypeList<TLH,TLT>,meta::TypeList< meta::SizeT<SIZE> ,TSLT>,SIZE,NOT_FOUND >{
691 template<
size_t SIZE,
class NOT_FOUND>
692 struct FindSizedType< meta::ListEnd,meta::ListEnd,SIZE,NOT_FOUND >{
693 typedef NOT_FOUND type;
696 template<
class TL,
class OTHER_TL>
697 struct MergeTypeLists;
699 template<
class THEAD,
class TTAIL,
class OTHER_TL>
700 struct MergeTypeLists<meta::TypeList<THEAD,TTAIL>,OTHER_TL>
702 typedef meta::TypeList<
704 typename MergeTypeLists<TTAIL,OTHER_TL>::type
708 template<
class OTHER_TL>
709 struct MergeTypeLists<meta::ListEnd,OTHER_TL>
711 typedef OTHER_TL type;
718 template<
class TL,
class RES_TL>
719 struct RemoveDuplicates;
725 struct RemoveDuplicates<TL, meta::ListEnd>{
729 typedef typename TL::HeadType FirstEntry;
731 typedef typename TL::TailType RestOfList;
733 typedef typename RemoveDuplicates<
735 meta::TypeList<FirstEntry, meta::ListEnd>
741 template<
class RES_TL>
742 struct RemoveDuplicates<meta::ListEnd, RES_TL>{
746 template<
class TL,
class RES_TL>
747 struct RemoveDuplicates{
750 typedef typename TL::HeadType FirstEntry;
752 typedef typename TL::TailType RestOfList;
755 typedef typename meta::EvalIf<
756 meta::HasTypeInTypeList<RES_TL, FirstEntry>::value,
758 meta::BackInsert<RES_TL, FirstEntry>
759 >::type ResultTypeList;
761 typedef typename RemoveDuplicates<
769 template<
class TL,
class OTHER_TL>
770 struct MergeTypeListsNoDuplicates{
771 typedef typename MergeTypeLists<TL, OTHER_TL>::type WithDuplicates;
772 typedef typename RemoveDuplicates<WithDuplicates, ListEnd>::type type;
781 template<
class TL,
class TYPE>
782 struct InsertInTypeListOrMoveToEnd{
783 typedef typename meta::If<
784 meta::HasTypeInTypeList<
788 typename meta::BackInsert<
789 typename DeleteTypeInTypeList< TL,TYPE >::type,
792 typename meta::BackInsert<
799 template<
class TL,
class OTHER_TL>
800 struct MergeTypeListsWithoutDups;
802 template<
class TL,
class THEAD,
class TTAIL>
803 struct MergeTypeListsWithoutDups<TL, meta::TypeList<THEAD, TTAIL> > {
804 typedef typename MergeTypeListsWithoutDups<
805 typename meta::InsertInTypeListOrMoveToEnd<TL, THEAD>::type,
811 struct MergeTypeListsWithoutDups<TL, meta::ListEnd> {
816 struct HasDuplicatesInTypeList;
818 template<
class THEAD,
class TTAIL>
819 struct HasDuplicatesInTypeList<meta::TypeList<THEAD,TTAIL> >{
820 typedef typename meta::EvalIf<
821 HasTypeInTypeList<TTAIL,THEAD>::value,
823 HasDuplicatesInTypeList< TTAIL>
827 value= HasDuplicatesInTypeList<meta::TypeList<THEAD,TTAIL> >::type::value
832 struct HasDuplicatesInTypeList<meta::ListEnd> : meta::FalseCase{
835 template<
class MAYBE_TYPELIST,
class EXPLICIT_FUNCTION_TYPE,
bool EDITABLE>
836 struct GenerateFunctionTypeList{
837 typedef typename meta::TypeListFromMaybeTypeList<MAYBE_TYPELIST>::type StartTypeList;
838 typedef typename meta::If<
840 typename InsertInTypeListOrMoveToEnd<StartTypeList,EXPLICIT_FUNCTION_TYPE>::type,
849 typedef T value_type;
850 typedef typename opengm::meta::AddReference<T>::type reference;
851 typedef typename opengm::meta::AddConstReference<T>::type const_reference;
852 typedef typename opengm::meta::If <
853 opengm::meta::TypeInfo<T>::IsFundamental::value,
854 typename opengm::meta::RemoveConst<T>::type
const,
855 typename opengm::meta::AddConstReference<T>::type
860 template<
class TList ,
template <
class>
class InstanceUnitType,
class TListSrc>
862 template<
class ListHead,
class ListTail,
template <
class>
class InstanceUnitType,
class TListSrc>
863 class FieldHelper< opengm::meta::TypeList<ListHead,ListTail> ,InstanceUnitType,TListSrc>
864 :
public FieldHelper<ListHead,InstanceUnitType,TListSrc>,
865 public FieldHelper<ListTail,InstanceUnitType,TListSrc>{
867 template<
class ListTail ,
template <
class>
class InstanceUnitType,
class TListSrc>
869 :
public InstanceUnitType<ListTail>{
871 template<
template <
class>
class InstanceUnitType,
class TListSrc>
872 class FieldHelper<opengm::meta::ListEnd,InstanceUnitType,TListSrc>{
875 template<
class TList ,
template <
class>
class InstanceUnitType>
877 :
public FieldHelper<TList,InstanceUnitType,TList>{
880 template <
typename T>
882 typedef InstanceUnitType<T> type;
884 template <
size_t Index>
885 struct RebingByIndex{
886 typedef InstanceUnitType<typename TypeAtTypeList<TList,Index>::type > type;
890 template<
class TList ,
class TYPE2,
template <
class ,
class >
class InstanceUnitType,
class TListSrc>
893 template<
class ListHead,
class ListTail,
class TYPE2,
template <
class,
class>
class InstanceUnitType,
class TListSrc>
894 class Field2Helper< opengm::meta::TypeList<ListHead,ListTail> ,TYPE2,InstanceUnitType,TListSrc>
895 :
public Field2Helper<ListHead,TYPE2,InstanceUnitType,TListSrc>,
896 public Field2Helper<ListTail,TYPE2,InstanceUnitType,TListSrc>{
899 template<
class ListTail ,
class TYPE2,
template <
class,
class>
class InstanceUnitType,
class TListSrc>
901 :
public InstanceUnitType<ListTail,TYPE2>{
904 template<
class TYPE2,
template <
class,
class>
class InstanceUnitType,
class TListSrc>
905 class Field2Helper<opengm::meta::ListEnd,TYPE2,InstanceUnitType,TListSrc>{
908 template<
class TList,
class TYPE2 ,
template <
class,
class>
class InstanceUnitType>
911 public Field2Helper<TList,TYPE2,InstanceUnitType,TList>{
914 template <
typename T>
916 typedef InstanceUnitType<T,TYPE2> type;
918 template <
size_t Index>
919 struct RebingByIndex{
920 typedef InstanceUnitType<typename TypeAtTypeList<TList,Index>::type,TYPE2 > type;
925 template<
size_t Index,
class IG>
926 static inline typename IG::template RebingByIndex<Index>::type &
929 IG & instanceGenerator
931 return instanceGenerator;
934 template<
size_t Index,
class IG>
935 static inline const typename IG::template RebingByIndex<Index>::type &
938 const IG & instanceGenerator
940 return instanceGenerator;
943 template<
class T,
class IG>
944 static inline typename IG::template RebingByType<T>::type &
947 IG & instanceGenerator
949 return instanceGenerator;
952 template<
class T,
class IG>
953 static inline const typename IG::template RebingByType<T>::type &
956 const IG & instanceGenerator
958 return instanceGenerator;
962 template<
class Factor,
size_t FunctionIndex>
963 class GetFunctionFromFactor
967 typedef typename meta::TypeAtTypeList<FunctionTypeList,FunctionIndex>::type FunctionType;
968 static inline const FunctionType &
get(
const Factor & factor) {
969 return factor.
template function<FunctionIndex>();
971 static inline FunctionType &
get( Factor & factor) {
972 return factor.
template function<FunctionIndex>();
976 template<
class Factor,
size_t FunctionIndex>
979 template<
class T,
size_t FunctionIndex>
980 class GetFunction<opengm::Factor<T>,FunctionIndex >{
983 typedef typename meta::TypeAtTypeList<FunctionTypeList,FunctionIndex>::type FunctionType;
985 static inline const FunctionType &
get(
const Factor<T> & factor) {
986 return factor.
template function<FunctionIndex>();
988 static inline FunctionType &
get(Factor<T> & factor) {
989 return factor.
template function<FunctionIndex>();
993 template<
class T,
class I,
class L,
size_t FunctionIndex>
994 class GetFunction<IndependentFactor<T,I,L>,FunctionIndex >{
997 static inline const FunctionType &
get(
const IndependentFactor<T,I,L> & factor) {
998 return factor.template function<0>();
1000 static inline FunctionType &
get(IndependentFactor<T,I,L> & factor) {
1001 return factor.template function<0>();
1005 template<
class Factor>
1006 class GetFunctionTypeIndex;
1009 class GetFunctionTypeIndex<opengm::Factor<T> >{
1012 return factor.functionType();
1015 return factor.functionType();
1019 template<
class T,
class I,
class L>
1020 class GetFunctionTypeIndex<opengm::IndependentFactor<T,I,L> >{
1031 class IsField : opengm::meta::FalseCase{};
1033 template<
class TList ,
template <
class>
class InstanceUnitType>
1034 class IsField< meta::Field<TList,InstanceUnitType> > : opengm::meta::TrueCase{};
1036 struct ErrorMessage{
1037 struct WRONG_FUNCTION_TYPE;
1040 template <
class MSG>
1041 struct OPENGM_METAPROGRAMMING_COMPILE_TIME_ASSERTION_FAILED_;
1043 struct OPENGM_METAPROGRAMMING_COMPILE_TIME_ASSERTION_FAILED_<meta::EmptyType >{
1052 template<
class TLIST,
size_t INITIAL_VALUE,
template <
size_t,
size_t>
class ACCUMULATOR>
1055 template<
class TLIST_HEAD,
class TLIST_TAIL,
size_t INITIAL_VALUE,
template <
size_t,
size_t>
class ACCUMULATOR>
1056 class Accumulate<meta::TypeList<TLIST_HEAD,TLIST_TAIL>,INITIAL_VALUE ,ACCUMULATOR >{
1079 template<
size_t INITIAL_VALUE,
template <
size_t,
size_t>
class ACCUMULATOR>
1080 class Accumulate<meta::ListEnd,INITIAL_VALUE ,ACCUMULATOR >{
1084 typedef SizeT<INITIAL_VALUE> type;
1088 struct PromoteToFloatingPoint{
1089 typedef typename meta::If<
1090 meta::IsFloatingPoint<T>::value ,
1097 template <
class BASE,
class DERIVED>
1099 typedef char yes[1];
1102 static yes& test(BASE*);
1103 static no& test(...);
1105 static DERIVED*
get(void);
1108 value = (
sizeof(test(
get())) ==
sizeof(yes))
1114 struct IsValidTrait {
1115 static const bool value = !Compare<typename T::ValueType, LinearConstraintFunctionTraitsUndefined>::value;
1122 struct GetLinearConstraintFunctionTypeList;
1125 template<
class THEAD,
class TTAIL>
1126 struct GetLinearConstraintFunctionTypeList<TypeList<THEAD,TTAIL> > {
1127 typedef TypeList<THEAD, typename GetLinearConstraintFunctionTypeList<TTAIL>::type > true_type;
1128 typedef typename TypeListFromMaybeTypeList<typename GetLinearConstraintFunctionTypeList<TTAIL>::type>::type false_type;
1130 template <
class FUNCTION,
bool IS_COMPLETE_TYPE>
1131 struct IsLinearConstraintFunction {
1132 typedef false_type type;
1135 template <
class FUNCTION>
1136 struct IsLinearConstraintFunction<FUNCTION, true> {
1137 typedef typename If<IsBaseOf<opengm::LinearConstraintFunctionBase<FUNCTION>, FUNCTION>::value, true_type, false_type>::type type;
1139 typedef IsValidTrait<opengm::LinearConstraintFunctionTraits<THEAD> > IsCompleteLinearConstraintFunction;
1141 typedef typename IsLinearConstraintFunction<THEAD, IsCompleteLinearConstraintFunction::value>::type type;
1146 struct GetLinearConstraintFunctionTypeList<ListEnd> {
1147 typedef ListEnd type;
1164 class T2 = meta::ListEnd,
1165 class T3 = meta::ListEnd,
1166 class T4 = meta::ListEnd,
1167 class T5 = meta::ListEnd,
1168 class T6 = meta::ListEnd,
1169 class T7 = meta::ListEnd,
1170 class T8 = meta::ListEnd,
1171 class T9 = meta::ListEnd,
1172 class T10 = meta::ListEnd,
1173 class T11 = meta::ListEnd,
1174 class T12 = meta::ListEnd,
1175 class T13 = meta::ListEnd,
1176 class T14 = meta::ListEnd,
1177 class T15 = meta::ListEnd
1179 struct FunctionTypeListGenerator {
1180 typedef meta::TypeList<T1, typename FunctionTypeListGenerator<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::type > type;
1184 struct FunctionTypeListGenerator<meta::ListEnd> {
1185 typedef meta::ListEnd type;
1192 #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...
ExplicitFunction< ValueType, IndexType, LabelType > FunctionType