// Support for multicomponent arrays #ifndef BZ_ARRAYMULTI_H #define BZ_ARRAYMULTI_H #ifndef BZ_ARRAY_H #error must be included via #endif BZ_NAMESPACE(blitz) /* * The multicomponent_traits class provides a mapping from multicomponent * tuples to the element type they contain. For example: * * multicomponent_traits >::T_numtype is float, * multicomponent_traits >::T_numtype is int. * * This is used to support Array::operator[], which extracts components * from a multicomponent array. */ // By default, produce a harmless component type, and zero components. template struct multicomponent_traits { typedef T_component T_element; enum { numComponents = 0 }; }; // TinyVector template struct multicomponent_traits > { typedef T_numtype T_element; enum { numComponents = N_rank }; }; // complex template struct multicomponent_traits > { typedef T T_element; enum { numComponents = 2 }; }; // This macro is provided so that users can register their own // multicomponent types. #define BZ_DECLARE_MULTICOMPONENT_TYPE(T_tuple,T,N) \ template<> \ struct multicomponent_traits { \ typedef T T_element; \ enum { numComponents = N }; \ }; BZ_NAMESPACE_END #endif // BZ_ARRAYMULTI_H