// 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) 2007-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) | |
/// \file | |
/// \brief base dimensions (mass, length, time...). | |
/// \details base dimension definition registration. | |
#ifndef BOOST_UNITS_BASE_DIMENSION_HPP | |
#define BOOST_UNITS_BASE_DIMENSION_HPP | |
#include <boost/units/config.hpp> | |
#include <boost/units/dim.hpp> | |
#include <boost/units/static_rational.hpp> | |
#include <boost/units/units_fwd.hpp> | |
#include <boost/units/detail/dimension_list.hpp> | |
#include <boost/units/detail/ordinal.hpp> | |
#include <boost/units/detail/prevent_redefinition.hpp> | |
namespace boost { | |
namespace units { | |
/// This must be in namespace boost::units so that ADL | |
/// will work with friend functions defined inline. | |
/// INTERNAL ONLY | |
template<long N> struct base_dimension_ordinal { }; | |
/// INTERNAL ONLY | |
template<class T, long N> struct base_dimension_pair { }; | |
/// INTERNAL ONLY | |
template<class T, long N> | |
struct check_base_dimension { | |
enum { | |
value = | |
sizeof(boost_units_is_registered(units::base_dimension_ordinal<N>())) == sizeof(detail::yes) && | |
sizeof(boost_units_is_registered(units::base_dimension_pair<T, N>())) != sizeof(detail::yes) | |
}; | |
}; | |
/// Defines a base dimension. To define a dimension you need to provide | |
/// the derived class (CRTP) and a unique integer. | |
/// @code | |
/// struct my_dimension : boost::units::base_dimension<my_dimension, 1> {}; | |
/// @endcode | |
/// It is designed so that you will get an error message if you try | |
/// to use the same value in multiple definitions. | |
template<class Derived, | |
long N | |
#if !defined(BOOST_UNITS_DOXYGEN) && !defined(__BORLANDC__) | |
, | |
class = typename detail::ordinal_has_already_been_defined< | |
check_base_dimension<Derived, N>::value | |
>::type | |
#endif | |
> | |
class base_dimension : | |
public ordinal<N> | |
{ | |
public: | |
/// INTERNAL ONLY | |
typedef base_dimension this_type; | |
/// A convenience typedef. Equivalent to boost::units::derived_dimension<Derived,1>::type. | |
#ifndef BOOST_UNITS_DOXYGEN | |
typedef list<dim<Derived,static_rational<1> >, dimensionless_type> dimension_type; | |
#else | |
typedef detail::unspecified dimension_type; | |
#endif | |
/// Provided for mpl compatability. | |
typedef Derived type; | |
private: | |
/// Register this ordinal | |
/// INTERNAL ONLY | |
friend detail::yes | |
boost_units_is_registered(const units::base_dimension_ordinal<N>&) | |
{ detail::yes result; return(result); } | |
/// But make sure we can identify the current instantiation! | |
/// INTERNAL ONLY | |
friend detail::yes | |
boost_units_is_registered(const units::base_dimension_pair<Derived, N>&) | |
{ detail::yes result; return(result); } | |
}; | |
} // namespace units | |
} // namespace boost | |
#endif // BOOST_UNITS_BASE_DIMENSION_HPP |