diff --git a/dune/common/utility.hh b/dune/common/utility.hh index f481c74e56f87b7a18576c43d42b1a9b889875f9..5f5455519b1655828d39dc1b551c806c3df5a335 100644 --- a/dune/common/utility.hh +++ b/dune/common/utility.hh @@ -3,6 +3,8 @@ #ifndef DUNE_UTILITY_HH #define DUNE_UTILITY_HH +#include <dune/common/static_assert.hh> + #include "tuples.hh" namespace Dune { @@ -25,122 +27,145 @@ namespace Dune { * in a class which you can only initialise in a later stage. */ template <class Tuple> - class NullPointerInitialiser {}; + class NullPointerInitialiser { + dune_static_assert(AlwaysFalse<Tuple>::value, "Attempt to use the " + "unspecialized version of NullPointerInitialiser. " + "NullPointerInitialiser needs to be specialized for " + "each possible tuple size. Naturally the number of " + "pre-defined specializations is limited arbitrarily. " + "Maybe you need to raise this limit by defining some " + "more specializations? Also check that the tuple this " + "is applied to really is a tuple of pointers only."); + public: + //! export the type of the tuples + typedef Tuple ResultType; + //! generate a zero-initialized tuple + static ResultType apply(); + }; - namespace +#ifndef DOXYGEN + template<class Tuple> + struct NullPointerInitialiser<const Tuple> + : public NullPointerInitialiser<Tuple> { - /** - * @brief Helper class for initialising null pointers. - * - * First template parameter is the tuple. - * Second templates parameter is the size of the tuple. - */ - template<class T, int size> - struct InitialiserHelper - {}; + typedef const Tuple ResultType; + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2,T3,T4,T5,T6,T7,T8,T9>,1> - { - static inline tuple<T1*,T2,T3,T4,T5,T6,T7,T8,T9> apply() - { - return tuple<T1*,T2,T3,T4,T5,T6,T7,T8,T9>(0); - } - }; + template<> + struct NullPointerInitialiser<tuple<> > { + typedef tuple<> ResultType; + static ResultType apply() { + return ResultType(); + } + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2*,T3,T4,T5,T6,T7,T8,T9>,2> - { - static inline tuple<T1*,T2*,T3,T4,T5,T6,T7,T8,T9> apply() - { - return tuple<T1*,T2*,T3,T4,T5,T6,T7,T8,T9>(0,0); - } - }; + template<class T0> + struct NullPointerInitialiser<tuple<T0*> > { + typedef tuple<T0*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0)); + } + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2*,T3*,T4,T5,T6,T7,T8,T9>,3> - { - static inline tuple<T1*,T2*,T3*,T4,T5,T6,T7,T8,T9> apply() - { - return tuple<T1*,T2*,T3*,T4,T5,T6,T7,T8,T9>(0,0,0); - } - }; + template<class T0, class T1> + struct NullPointerInitialiser<tuple<T0*, T1*> > { + typedef tuple<T0*, T1*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0)); + } + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2*,T3*,T4*,T5,T6,T7,T8,T9>,4> - { - static inline tuple<T1*,T2*,T3*,T4*,T5,T6,T7,T8,T9> apply() - { - return tuple<T1*,T2*,T3*,T4*,T5,T6,T7,T8,T9>(0,0,0,0); - } - }; + template<class T0, class T1, class T2> + struct NullPointerInitialiser<tuple<T0*, T1*, T2*> > { + typedef tuple<T0*, T1*, T2*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0), + static_cast<T2*>(0)); + } + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2*,T3*,T4*,T5*,T6,T7,T8,T9>,5> - { - static inline tuple<T1*,T2*,T3*,T4*,T5*,T6,T7,T8,T9> apply() - { - return tuple<T1*,T2*,T3*,T4*,T5*,T6,T7,T8,T9>(0,0,0,0,0); - } - }; + template<class T0, class T1, class T2, class T3> + struct NullPointerInitialiser<tuple<T0*, T1*, T2*, T3*> > { + typedef tuple<T0*, T1*, T2*, T3*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0), + static_cast<T2*>(0), static_cast<T3*>(0)); + } + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7,T8,T9>,6> - { - static inline tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7,T8,T9> apply() - { - return tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7,T8,T9>(0,0,0,0,0,0); - } - }; + template<class T0, class T1, class T2, class T3, class T4> + struct NullPointerInitialiser<tuple<T0*, T1*, T2*, T3*, T4*> > { + typedef tuple<T0*, T1*, T2*, T3*, T4*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0), + static_cast<T2*>(0), static_cast<T3*>(0), + static_cast<T4*>(0)); + } + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8,T9>,7> - { - static inline tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8,T9> apply() - { - return tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8,T9>(0,0,0,0,0,0,0); - } - }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8*,T9>,8> - { - static inline tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8*,T9> apply() - { - return tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8*,T9>(0,0,0,0,0,0,0,0); - } - }; + template<class T0, class T1, class T2, class T3, class T4, class T5> + struct NullPointerInitialiser<tuple<T0*, T1*, T2*, T3*, T4*, T5*> > { + typedef tuple<T0*, T1*, T2*, T3*, T4*, T5*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0), + static_cast<T2*>(0), static_cast<T3*>(0), + static_cast<T4*>(0), static_cast<T5*>(0)); + } + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - struct InitialiserHelper<tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8*,T9*>,9> - { - static inline tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8*,T9*> apply() - { - return tuple<T1*,T2*,T3*,T4*,T5*,T6*,T7*,T8*,T9*>(0,0,0,0,0,0,0,0,0); - } - }; - } + template<class T0, class T1, class T2, class T3, class T4, class T5, + class T6> + struct NullPointerInitialiser<tuple<T0*, T1*, T2*, T3*, T4*, T5*, T6*> > { + typedef tuple<T0*, T1*, T2*, T3*, T4*, T5*, T6*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0), + static_cast<T2*>(0), static_cast<T3*>(0), + static_cast<T4*>(0), static_cast<T5*>(0), + static_cast<T6*>(0)); + } + }; - template<typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9> - class NullPointerInitialiser<tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9> > - { - public: - typedef tuple<T1,T2,T3,T4,T5,T6,T7,T8,T9> ResultType; + template<class T0, class T1, class T2, class T3, class T4, class T5, + class T6, class T7> + struct NullPointerInitialiser<tuple<T0*, T1*, T2*, T3*, T4*, T5*, T6*, + T7*> > { + typedef tuple<T0*, T1*, T2*, T3*, T4*, T5*, T6*, T7*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0), + static_cast<T2*>(0), static_cast<T3*>(0), + static_cast<T4*>(0), static_cast<T5*>(0), + static_cast<T6*>(0), static_cast<T7*>(0)); + } + }; - static inline ResultType apply() - { - return InitialiserHelper<ResultType, tuple_size<ResultType>::value>::apply(); + template<class T0, class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8> + struct NullPointerInitialiser<tuple<T0*, T1*, T2*, T3*, T4*, T5*, T6*, + T7*, T8*> > { + typedef tuple<T0*, T1*, T2*, T3*, T4*, T5*, T6*, T7*, T8*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0), + static_cast<T2*>(0), static_cast<T3*>(0), + static_cast<T4*>(0), static_cast<T5*>(0), + static_cast<T6*>(0), static_cast<T7*>(0), + static_cast<T8*>(0)); + } + }; + + template<class T0, class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9> + struct NullPointerInitialiser<tuple<T0*, T1*, T2*, T3*, T4*, T5*, T6*, + T7*, T8*, T9*> > { + typedef tuple<T0*, T1*, T2*, T3*, T4*, T5*, T6*, T7*, T8*, T9*> ResultType; + static ResultType apply() { + return ResultType(static_cast<T0*>(0), static_cast<T1*>(0), + static_cast<T2*>(0), static_cast<T3*>(0), + static_cast<T4*>(0), static_cast<T5*>(0), + static_cast<T6*>(0), static_cast<T7*>(0), + static_cast<T8*>(0), static_cast<T9*>(0)); } }; +#endif // !defined(DOXYGEN) /** * @brief Deletes all objects pointed to in a tuple of pointers.