// Boost.Units - A C++ library for zero-overhead dimensional analysis and // unit/quantity manipulation and conversion // // Copyright (C) 2003-2008 Matthias Christian Schabel // Copyright (C) 2008 Steven Watanabe // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_UNITS_STATIC_CONSTANT_HPP #define BOOST_UNITS_STATIC_CONSTANT_HPP #include /// A convenience macro that allows definition of static /// constants in headers in an ODR-safe way. #define BOOST_UNITS_STATIC_CONSTANT(name, type) \ template \ struct name##_instance_t \ { \ static const type instance; \ }; \ \ namespace \ { \ static const type& name = name##_instance_t::instance; \ } \ \ template \ const type name##_instance_t::instance /// A convenience macro for static constants with auto /// type deduction. #if BOOST_UNITS_HAS_TYPEOF #if BOOST_UNITS_HAS_BOOST_TYPEOF #define BOOST_UNITS_AUTO_STATIC_CONSTANT(name, value) \ BOOST_TYPEOF_NESTED_TYPEDEF(name##_nested_t, value) \ BOOST_UNITS_STATIC_CONSTANT(name, name##_nested_t::type) = (value) #elif BOOST_UNITS_HAS_MWERKS_TYPEOF #define BOOST_UNITS_AUTO_STATIC_CONSTANT(name, value) \ BOOST_UNITS_STATIC_CONSTANT(name, __typeof__(value)) = (value) #elif BOOST_UNITS_HAS_GNU_TYPEOF #define BOOST_UNITS_AUTO_STATIC_CONSTANT(name, value) \ BOOST_UNITS_STATIC_CONSTANT(name, typeof(value)) = (value) #endif // BOOST_UNITS_HAS_BOOST_TYPEOF #endif // BOOST_UNITS_HAS_TYPEOF #endif // BOOST_UNITS_STATIC_CONSTANT_HPP