/* Boost interval/policies.hpp template implementation file

 *

 * Copyright 2003 Guillaume Melquiond

 *

 * 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_NUMERIC_INTERVAL_POLICIES_HPP

#define BOOST_NUMERIC_INTERVAL_POLICIES_HPP



#include <boost/numeric/interval/interval.hpp>



namespace boost {

namespace numeric {

namespace interval_lib {



/*

 * policies class

 */



template<class Rounding, class Checking>

struct policies

{

  typedef Rounding rounding;

  typedef Checking checking;

};



/*

 * policies switching classes

 */



template<class OldInterval, class NewRounding>

class change_rounding

{

  typedef typename OldInterval::base_type T;

  typedef typename OldInterval::traits_type p;

  typedef typename p::checking checking;

public:

  typedef interval<T, policies<NewRounding, checking> > type;

};



template<class OldInterval, class NewChecking>

class change_checking

{

  typedef typename OldInterval::base_type T;

  typedef typename OldInterval::traits_type p;

  typedef typename p::rounding rounding;

public:

  typedef interval<T, policies<rounding, NewChecking> > type;

};



/*

 * Protect / unprotect: control whether the rounding mode is set/reset

 * at each operation, rather than once and for all.

 */



template<class OldInterval>

class unprotect

{

  typedef typename OldInterval::base_type T;

  typedef typename OldInterval::traits_type p;

  typedef typename p::rounding r;

  typedef typename r::unprotected_rounding newRounding;

public:

  typedef typename change_rounding<OldInterval, newRounding>::type type;

};



} // namespace interval_lib

} // namespace numeric

} // namespace boost





#endif // BOOST_NUMERIC_INTERVAL_POLICIES_HPP

