/*
 * Copyright (c) 1996,1997
 * Silicon Graphics Computer Systems, Inc.
 *
 * Copyright (c) 1999
 * Boris Fomitchev
 *
 * This material is provided "as is", with absolutely no warranty expressed
 * or implied. Any use is at your own risk.
 *
 * Permission to use or copy this software for any purpose is hereby granted
 * without fee, provided the above notices are retained on all copies.
 * Permission to modify the code and to distribute modified code is granted,
 * provided the above notices are retained, and a notice that the code was
 * modified is included with the above copyright notice.
 *
 */

#ifndef _STLP_FUNCTIONAL

#ifndef _STLP_OUTERMOST_HEADER_ID
#  define _STLP_OUTERMOST_HEADER_ID 0x27
#  include <stl/_prolog.h>
#  define _STLP_FUNCTIONAL
#endif

#if (_STLP_OUTERMOST_HEADER_ID == 0x27)
#  ifndef _STLP_INTERNAL_FUNCTION_H
#    include <stl/_function.h>
#  endif
#endif

#if (_STLP_OUTERMOST_HEADER_ID != 0x27) || defined (_STLP_IMPORT_VENDOR_STD)
#  if defined (_STLP_HAS_INCLUDE_NEXT)
#    include_next <functional>
#  else
#    include _STLP_NATIVE_HEADER(functional)
#  endif
#endif

#if (_STLP_OUTERMOST_HEADER_ID == 0x27)
#  include <stl/_epilog.h>
#  undef _STLP_OUTERMOST_HEADER_ID
#endif

#if !defined(_STLP_NO_EXTENSIONS) && defined(_STLP_USE_BOOST_SUPPORT)

#include <boost/ref.hpp>
#include <boost/utility/result_of.hpp>
#include <boost/bind/placeholders.hpp>
#include <boost/mem_fn.hpp>
#include <boost/bind.hpp>

namespace boost {

template<class T> class reference_wrapper;
template<class T> reference_wrapper<T> const ref(T &);
template<class T> inline reference_wrapper<T const> const cref(T const &);

template<typename F> struct result_of;

namespace _mfi {
template<class R, class T> class dm;
}

template<class R, class T> _mfi::dm<R, T> mem_fn(R T::*f);

} // namespace boost

_STLP_BEGIN_NAMESPACE

namespace tr1 {

using ::boost::reference_wrapper;
using ::boost::ref;
using ::boost::cref;

using ::boost::result_of;

using ::boost::mem_fn;

using ::boost::bind;

namespace placeholders {
  using ::_1;
  using ::_2;
  using ::_3;
  using ::_4;
  using ::_5;
  using ::_6;
  using ::_7;
  using ::_8;
  using ::_9;
} // placeholders

} // namespace tr1

_STLP_END_NAMESPACE

#endif // !_STLP_NO_EXTENSIONS && _STLP_USE_BOOST_SUPPORT

#endif /* _STLP_FUNCTIONAL */

#if !defined(_STLP_FUNCTIONAL_FUN) && !defined(_STLP_NO_EXTENSIONS) && defined(_STLP_USE_BOOST_SUPPORT)

#ifndef BOOST_FUNCTION_NUM_ARGS // avoid recursive includes

// #ifdef BOOST_FUNCTION_BASE_HEADER
// #undef BOOST_FUNCTION_BASE_HEADER
// #endif

// #ifdef BOOST_FUNCTION_PROLOGUE_HPP
// #undef BOOST_FUNCTION_PROLOGUE_HPP
// #endif

#define _STLP_FUNCTIONAL_FUN

#ifndef BOOST_FUNCTION_BASE_HEADER // avoid recursive includes
#  include <boost/function.hpp>
#else
namespace boost {
class bad_function_call;
template<typename Signature, typename Allocator >
class function;
template<typename Signature, typename Allocator>
void swap(function<Signature, Allocator>& f1, function<Signature, Allocator>& f2);
}
#endif

_STLP_BEGIN_NAMESPACE

namespace tr1 {

using ::boost::bad_function_call;
using ::boost::function;
using ::boost::swap;

} // namespace tr1

_STLP_END_NAMESPACE

#endif // !BOOST_FUNCTION_NUM_ARGS

#endif // !_STLP_FUNCTIONAL_REF && !_STLP_NO_EXTENSIONS && _STLP_USE_BOOST_SUPPORT

// Local Variables:
// mode:C++
// End:
