00001 00015 #pragma once 00016 00017 #include "Loggable.h" 00018 00019 #include <vector> 00020 00021 #include <boost/utility/enable_if.hpp> 00022 #include <boost/type_traits.hpp> 00023 00024 namespace Nvidia { 00025 namespace Logging { 00026 00028 struct NullType {}; 00029 00044 template<typename HeadType, typename TailType> 00045 class Chain 00046 { 00047 template <typename TailType2, typename HeadType2> 00048 friend class Chain; 00049 00050 private: 00052 HeadType m_head; 00054 const TailType& m_tail; 00055 00056 public: 00058 Chain(HeadType head, const TailType& tail): m_head(head), m_tail(tail) {} 00059 00061 Chain(const Chain<HeadType, TailType>& aChain) 00062 { 00063 m_head = aChain.Head; 00064 m_tail = aChain.Tail; 00065 } 00066 00068 Chain<HeadType, TailType>& operator=(const Chain<HeadType, TailType>& aChain) 00069 { 00070 m_head = aChain.Head; 00071 m_tail = aChain.Tail; 00072 return *this; 00073 } 00074 00076 HeadType GetHead() const 00077 { 00078 return m_head; 00079 } 00080 00082 const TailType& GetTail() const 00083 { 00084 return m_tail; 00085 } 00086 00093 template<typename T> 00094 typename boost::enable_if_c<boost::is_arithmetic<T>::value, 00095 Chain<T, Chain<HeadType, TailType> > >::type 00096 operator+(T head) 00097 { 00098 return Chain<T, Chain<HeadType, TailType> >(head, *this); 00099 } 00100 00107 template<typename T> 00108 typename boost::disable_if_c<boost::is_arithmetic<T>::value, 00109 Chain<const T&, Chain<HeadType, TailType> > >::type 00110 operator+(const T& head) 00111 { 00112 return Chain<const T&, Chain<HeadType, TailType> >(head, *this); 00113 } 00114 }; 00115 00117 typedef Chain<NullType, NullType> EmptyChain; 00118 00120 inline EmptyChain MakeEmptyChain() 00121 { 00122 return Chain<NullType, NullType>(NullType(), NullType()); 00123 } 00124 00125 } 00126 }