#ifndef BOOST_SERIALIZATION_PFTO_HPP | |
#define BOOST_SERIALIZATION_PFTO_HPP | |
// MS compatible compilers support #pragma once | |
#if defined(_MSC_VER) && (_MSC_VER >= 1020) | |
# pragma once | |
#endif | |
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 | |
// pfto.hpp: workarounds for compilers which have problems supporting | |
// Partial Function Template Ordering (PFTO). | |
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . | |
// Use, modification and distribution is subject to 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/serialization for updates, documentation, and revision history. | |
// PFTO version is used to specify the last argument of certain functions | |
// Function it is used to support compilers that fail to support correct Partial | |
// Template Ordering | |
#include <boost/config.hpp> | |
// some compilers can use an exta argument and use function overloading | |
// to choose desired function. This extra argument is long in the default | |
// function implementation and int for the rest. The function is called | |
// with an int argument. This first attempts to match functions with an | |
// int argument before the default one (with a long argument). This is | |
// known to function with VC 6.0. On other compilers this fails (Borland) | |
// or causes other problems (GCC). note: this | |
#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) | |
#define BOOST_PFTO long | |
#else | |
#define BOOST_PFTO | |
#endif | |
// here's another approach. Rather than use a default function - make sure | |
// there is no default at all by requiring that all function invocations | |
// have a "wrapped" argument type. This solves a problem with VC 6.0 | |
// (and perhaps others) while implementing templated constructors. | |
namespace boost { | |
namespace serialization { | |
template<class T> | |
struct pfto_wrapper { | |
const T & t; | |
operator const T & (){ | |
return t; | |
} | |
pfto_wrapper (const T & rhs) : t(rhs) {} | |
}; | |
template<class T> | |
pfto_wrapper< T > make_pfto_wrapper(const T & t, BOOST_PFTO int){ | |
return pfto_wrapper< T >(t); | |
} | |
template<class T> | |
pfto_wrapper< T > make_pfto_wrapper(const pfto_wrapper< T > & t, int){ | |
return t; | |
} | |
} // namespace serialization | |
} // namespace boost | |
#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING | |
#define BOOST_PFTO_WRAPPER(T) \ | |
boost::serialization::pfto_wrapper< T > | |
#define BOOST_MAKE_PFTO_WRAPPER(t) \ | |
boost::serialization::make_pfto_wrapper(t, 0) | |
#else | |
#define BOOST_PFTO_WRAPPER(T) T | |
#define BOOST_MAKE_PFTO_WRAPPER(t) t | |
#endif | |
#endif // BOOST_SERIALIZATION_PFTO_HPP |