| // (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 NDNBOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED |
| #define NDNBOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED |
| |
| #if defined(_MSC_VER) && (_MSC_VER >= 1020) |
| # pragma once |
| #endif |
| |
| #include <ndnboost/iostreams/detail/select.hpp> |
| #include <ndnboost/mpl/identity.hpp> |
| #include <ndnboost/type_traits/is_same.hpp> |
| |
| namespace ndnboost { 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 |
| ::ndnboost::is_same< |
| Access, protected_ |
| >, prot_<T>, |
| ::ndnboost::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 NDNBOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED |