text: // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
  // (C) Copyright 2003-2007 Jonathan Turkanis
  // 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.)
  
  // See http://www.boost.org/libs/iostreams for documentation.
  
  // Contains the definition of the class template access_control, which
  // allows the type of inheritance from a provided base class to be specified 
  // using a template parameter.
  
  
  #ifndef BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED
  #define BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED
  
  #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  # pragma once
  #endif              
  
  #include <boost/iostreams/detail/select.hpp>
  #include <boost/mpl/identity.hpp>
  #include <boost/type_traits/is_same.hpp>
  
  namespace boost { namespace iostreams {
  
  struct protected_ { };  // Represents protected inheritance.
  struct public_ { };     // Represents public inheritance.
  
  
  namespace detail {
  
      // Implements protected inheritance.
      template<typename U>
      struct prot_ : protected U 
      { 
          prot_() { }
          template<typename V> prot_(V v) : U(v) { }
      };
  
      // Implements public inheritance.
      template<typename U> struct pub_ : public U { 
          pub_() { }
          template<typename V> pub_(V v) : U(v) { }
      };
  
  //
  // Used to deduce the base type for the template access_control.
  //
  template<typename T, typename Access>
  struct access_control_base {
      typedef int                                 bad_access_specifier;
      typedef typename 
              iostreams::select<  // Disambiguation for Tru64
                  ::boost::is_same<
                      Access, protected_
                  >,                              prot_<T>,
                  ::boost::is_same<
                      Access, public_
                  >,                              pub_<T>,
                  else_,                          bad_access_specifier
              >::type                             type;
  };
  
  } // End namespace detail.
  
  //
  // Template name: access_control.
  // Description: Allows the type of inheritance from a provided base class
  //      to be specified using an int template parameter.
  // Template parameters:
  //      Base - The class from which to inherit (indirectly.)
  //      Access - The type of access desired. Must be one of the 
  //          values access_base::prot or access_base::pub.
  //
  template< typename T, typename Access,
            typename Base = // VC6 workaraound (Compiler Error C2516)
                typename detail::access_control_base<T, Access>::type >
  struct access_control : public Base { 
      access_control() { }
      template<typename U> explicit access_control(U u) : Base(u) { }
  };
  
  //----------------------------------------------------------------------------//
  
  } } // End namespaces iostreams, boost.
  
  #endif // #ifndef BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED
  