Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file is_noncopyable.hpp Chris@16: /// Utility for detecting when types are non-copyable Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_PROTO_DETAIL_IS_NONCOPYABLE_HPP_EAN_19_07_2012 Chris@16: #define BOOST_PROTO_DETAIL_IS_NONCOPYABLE_HPP_EAN_19_07_2012 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace proto { namespace detail Chris@16: { Chris@16: // All classes derived from std::ios_base have these public nested types, Chris@16: // and are non-copyable. This is an imperfect test, but it's the best we Chris@16: // we can do. Chris@16: template Chris@16: yes_type check_is_iostream( Chris@16: typename T::failure * Chris@16: , typename T::Init * Chris@16: , typename T::fmtflags * Chris@16: , typename T::iostate * Chris@16: , typename T::openmode * Chris@16: , typename T::seekdir * Chris@16: ); Chris@16: Chris@16: template Chris@16: no_type check_is_iostream(...); Chris@16: Chris@16: template Chris@16: struct is_iostream Chris@16: { Chris@16: static bool const value = sizeof(yes_type) == sizeof(check_is_iostream(0,0,0,0,0,0)); Chris@16: typedef mpl::bool_ type; Chris@16: }; Chris@16: Chris@16: /// INTERNAL ONLY Chris@16: // This should be a customization point. And it serves the same purpose Chris@16: // as the is_noncopyable trait in Boost.Foreach. Chris@16: template Chris@16: struct is_noncopyable Chris@16: : mpl::or_< Chris@16: is_function Chris@16: , is_abstract Chris@16: , is_iostream Chris@16: , is_base_of Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct is_noncopyable Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: }}} Chris@16: Chris@16: #endif