1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) 2 // (C) Copyright 2003-2007 Jonathan Turkanis 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) 5 6 // See http://www.boost.org/libs/iostreams for documentation. 7 8 // Contains the definition of the class template access_control, which 9 // allows the type of inheritance from a provided base class to be specified 10 // using a template parameter. 11 12 13 #ifndef BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED 14 #define BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED 15 16 #if defined(_MSC_VER) 17 # pragma once 18 #endif 19 20 #include <boost/iostreams/detail/select.hpp> 21 #include <boost/mpl/identity.hpp> 22 #include <boost/type_traits/is_same.hpp> 23 24 namespace boost { namespace iostreams { 25 26 struct protected_ { }; // Represents protected inheritance. 27 struct public_ { }; // Represents public inheritance. 28 29 30 namespace detail { 31 32 // Implements protected inheritance. 33 template<typename U> 34 struct prot_ : protected U 35 { prot_boost::iostreams::detail::prot_36 prot_() { } prot_boost::iostreams::detail::prot_37 template<typename V> prot_(V v) : U(v) { } 38 }; 39 40 // Implements public inheritance. 41 template<typename U> struct pub_ : public U { pub_boost::iostreams::detail::pub_42 pub_() { } pub_boost::iostreams::detail::pub_43 template<typename V> pub_(V v) : U(v) { } 44 }; 45 46 // 47 // Used to deduce the base type for the template access_control. 48 // 49 template<typename T, typename Access> 50 struct access_control_base { 51 typedef int bad_access_specifier; 52 typedef typename 53 iostreams::select< // Disambiguation for Tru64 54 ::boost::is_same< 55 Access, protected_ 56 >, prot_<T>, 57 ::boost::is_same< 58 Access, public_ 59 >, pub_<T>, 60 else_, bad_access_specifier 61 >::type type; 62 }; 63 64 } // End namespace detail. 65 66 // 67 // Template name: access_control. 68 // Description: Allows the type of inheritance from a provided base class 69 // to be specified using an int template parameter. 70 // Template parameters: 71 // Base - The class from which to inherit (indirectly.) 72 // Access - The type of access desired. Must be one of the 73 // values access_base::prot or access_base::pub. 74 // 75 template< typename T, typename Access, 76 typename Base = // VC6 workaraound (Compiler Error C2516) 77 typename detail::access_control_base<T, Access>::type > 78 struct access_control : public Base { access_controlboost::iostreams::access_control79 access_control() { } access_controlboost::iostreams::access_control80 template<typename U> explicit access_control(U u) : Base(u) { } 81 }; 82 83 //----------------------------------------------------------------------------// 84 85 } } // End namespaces iostreams, boost. 86 87 #endif // #ifndef BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED 88