/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2011-2014 Danny Robson */ #ifndef CRUFT_UTIL_TYPES_HPP #define CRUFT_UTIL_TYPES_HPP #include #include #include #include #include /////////////////////////////////////////////////////////////////////////////// // analogue of std::data for use until we get proper c++17 support namespace cruft { template auto data (T &t) { return t.data (); } //------------------------------------------------------------------------- template auto data (const T &t) { return t.data (); } //------------------------------------------------------------------------- template constexpr T* data (T (&t)[N]) { return &t[0]; } //------------------------------------------------------------------------- template constexpr const T* data (const T (&t)[N]) { return &t[0]; } } /////////////////////////////////////////////////////////////////////////////// /// returns the first argument from a parameter pack which can evaluate to true. template T first (T a) { if (a) return a; throw std::logic_error ("no valid object"); } //----------------------------------------------------------------------------- template T first (T a, Args&& ...b) { if (a) return a; return first (std::forward(b)...); } namespace cruft { ///------------------------------------------------------------------------ /// represents a type as a POD struct (but is statically recoverable via /// the 'type' member). template struct type_tag { typedef T type; }; ///------------------------------------------------------------------------ /// count the number of parameters we are given. useful for counting /// arguments in variadic macros (ie, sizeof... (__VA_ARGS__)) template constexpr size_t param_count (const T... t) { // prevent unused variable warnings by never forwarding recursively // ideally we'd use void casting, but it doesn't work for parameter // packs if (false) return param_count (t...); return sizeof... (t); } } #endif