typelist.h
来自「C++封装的视频采集代码」· C头文件 代码 · 共 791 行 · 第 1/3 页
H
791 行
// returns a typelist that is TList followed by T and NullType-terminated//////////////////////////////////////////////////////////////////////////////// template <class TList, class T> struct Append; template <class Head, class Tail, class T> struct Append<Typelist<Head, Tail>, T> { typedef Typelist<Head, typename Append<Tail, T>::Result> Result; }; template <class Head, class Tail> struct Append<NullType, Typelist<Head, Tail> > { typedef Typelist<Head, Tail> Result; }; template <class T> struct Append<NullType, T> { typedef TYPELIST_1(T) Result; }; template <> struct Append<NullType, NullType> { typedef NullType Result; };////////////////////////////////////////////////////////////////////////////////// class template Erase// Erases the first occurence, if any, of a type in a typelist// Invocation (TList is a typelist and T is a type):// Erase<TList, T>::Result// returns a typelist that is TList without the first occurence of T//////////////////////////////////////////////////////////////////////////////// template<class TList, class T> struct Erase { typedef Typelist<typename TList::Head, typename Erase<typename TList::Tail, T>::Result> Result; }; template <class T, class Tail> struct Erase<Typelist<T, Tail>, T> { typedef Tail Result; }; template <class T> struct Erase<NullType, T> { typedef NullType Result; };////////////////////////////////////////////////////////////////////////////////// class template EraseAll// Erases all first occurences, if any, of a type in a typelist// Invocation (TList is a typelist and T is a type):// EraseAll<TList, T>::Result// returns a typelist that is TList without any occurence of T//////////////////////////////////////////////////////////////////////////////// template<class TList, class T> struct EraseAll { typedef Typelist<typename TList::Head, typename EraseAll<typename TList::Tail, T>::Result> Result; }; template <class T, class Tail> struct EraseAll<Typelist<T, Tail>, T> { typedef typename EraseAll<Tail, T>::Result Result; }; template <class T> struct EraseAll<NullType, T> { typedef NullType Result; };////////////////////////////////////////////////////////////////////////////////// class template NoDuplicates// Removes all duplicate types in a typelist// Invocation (TList is a typelist):// NoDuplicates<TList, T>::Result//////////////////////////////////////////////////////////////////////////////// template <class TList> struct NoDuplicates; template <class Head, class Tail> struct NoDuplicates< Typelist<Head, Tail> > { private: typedef typename NoDuplicates<Tail>::Result L1; typedef typename Erase<L1, Head>::Result L2; public: typedef Typelist<Head, L2> Result; }; template <> struct NoDuplicates<NullType> { typedef NullType Result; };////////////////////////////////////////////////////////////////////////////////// class template Replace// Replaces the first occurence of a type in a typelist, with another type// Invocation (TList is a typelist, T, U are types):// Replace<TList, T, U>::Result// returns a typelist in which the first occurence of T is replaced with U//////////////////////////////////////////////////////////////////////////////// template<class TList, class T, class U> struct Replace { typedef Typelist<typename TList::Head, typename Replace<typename TList::Tail, T, U>::Result> Result; }; template <class T, class Tail, class U> struct Replace<Typelist<T, Tail>, T, U> { typedef Typelist<U, Tail> Result; }; template <class T, class U> struct Replace<NullType, T, U> { typedef NullType Result; };////////////////////////////////////////////////////////////////////////////////// class template ReplaceAll// Replaces all occurences of a type in a typelist, with another type// Invocation (TList is a typelist, T, U are types):// Replace<TList, T, U>::Result// returns a typelist in which all occurences of T is replaced with U//////////////////////////////////////////////////////////////////////////////// template<class TList, class T, class U> struct ReplaceAll { typedef Typelist<typename TList::Head, typename ReplaceAll<typename TList::Tail, T, U>::Result> Result; }; template <class T, class Tail, class U> struct ReplaceAll<Typelist<T, Tail>, T, U> { typedef Typelist<U, typename ReplaceAll<Tail, T, U>::Result> Result; }; template <class T, class U> struct ReplaceAll<NullType, T, U> { typedef NullType Result; };////////////////////////////////////////////////////////////////////////////////// class template Reverse// Reverses a typelist// Invocation (TList is a typelist):// Reverse<TList>::Result// returns a typelist that is TList reversed//////////////////////////////////////////////////////////////////////////////// template <class TList> struct Reverse; template <class Head, class Tail> struct Reverse< Typelist<Head, Tail> > { typedef typename Append< typename Reverse<Tail>::Result, Head>::Result Result; }; template <> struct Reverse<NullType> { typedef NullType Result; };////////////////////////////////////////////////////////////////////////////////// class template MostDerived// Finds the type in a typelist that is the most derived from a given type// Invocation (TList is a typelist, T is a type):// MostDerived<TList, T>::Result// returns the type in TList that's the most derived from T//////////////////////////////////////////////////////////////////////////////// template <class TList, class T> struct MostDerived; template <class Head, class Tail, class T> struct MostDerived<Typelist<Head, Tail>, T> { private: typedef typename MostDerived<Tail, T>::Result Candidate; public: typedef typename Select< ::Loki::Conversion<const volatile Head *, const volatile Candidate *>::exists==1 && ::Loki::Conversion<const volatile Candidate *, const volatile void *>::sameType==0, Head, Candidate>::Result Result; }; template <class T> struct MostDerived<NullType, T> { typedef T Result; };////////////////////////////////////////////////////////////////////////////////// class template DerivedToFront// Arranges the types in a typelist so that the most derived types appear first// Invocation (TList is a typelist):// DerivedToFront<TList>::Result// returns the reordered TList//////////////////////////////////////////////////////////////////////////////// template <class TList> struct DerivedToFront; template <class Head, class Tail> struct DerivedToFront< Typelist<Head, Tail> > { private: typedef typename MostDerived<Tail, Head>::Result TheMostDerived; typedef typename Replace<Tail, TheMostDerived, Head>::Result Temp; typedef typename DerivedToFront<Temp>::Result L; public: typedef Typelist<TheMostDerived, L> Result; }; template <> struct DerivedToFront<NullType> { typedef NullType Result; }; } // namespace TL} // namespace Loki////////////////////////////////////////////////////////////////////////////////// Change log:// June 09, 2001: Fix bug in parameter list of macros TYPELIST_23 to TYPELIST_27// (credit due to Dave Taylor)// June 20, 2001: ported by Nick Thurn to gcc 2.95.3. Kudos, Nick!!!// November 22, 2001: fixed bug in DerivedToFront// (credit due to Gianni Luciani who noticed the bug first;// Adam Wilkshire;// Friedrik Hedman who fixed the bug but didn't send the fix;// Kevin Cline who sent the first actual fix)// July 16, 2002: Ported by Terje Sletteb
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?