diff options
Diffstat (limited to 'stlport/stlport/stl/_function_base.h')
-rw-r--r-- | stlport/stlport/stl/_function_base.h | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/stlport/stlport/stl/_function_base.h b/stlport/stlport/stl/_function_base.h new file mode 100644 index 0000000..1e7f4f5 --- /dev/null +++ b/stlport/stlport/stl/_function_base.h @@ -0,0 +1,217 @@ +/* + * + * Copyright (c) 1994 + * Hewlett-Packard Company + * + * Copyright (c) 1996-1998 + * Silicon Graphics Computer Systems, Inc. + * + * Copyright (c) 1997 + * Moscow Center for SPARC Technology + * + * 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. + * + */ + +/* NOTE: This is an internal header file, included by other STL headers. + * You should not attempt to use it directly. + */ + +#ifndef _STLP_INTERNAL_FUNCTION_BASE_H +#define _STLP_INTERNAL_FUNCTION_BASE_H + +#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_TYPE_TRAITS_H) +# include <stl/type_traits.h> +#endif + +_STLP_BEGIN_NAMESPACE + +template <class _Arg, class _Result> +struct unary_function { + typedef _Arg argument_type; + typedef _Result result_type; +#if !defined (__BORLANDC__) || (__BORLANDC__ < 0x580) +protected: + /* This class purpose is to be derived but it is not polymorphic so users should never try + * to destroy an instance of it directly. The protected non-virtual destructor make this + * fact obvious at compilation time. */ + ~unary_function() {} +#endif +}; + +template <class _Arg1, class _Arg2, class _Result> +struct binary_function { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; +#if !defined (__BORLANDC__) || (__BORLANDC__ < 0x580) +protected: + /* See unary_function comment. */ + ~binary_function() {} +#endif +}; + +template <class _Tp> +struct equal_to : public binary_function<_Tp, _Tp, bool> { + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; } +}; + +template <class _Tp> +struct less : public binary_function<_Tp,_Tp,bool> +#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) +/* less is the default template parameter for many STL containers, to fully use + * the move constructor feature we need to know that the default less is just a + * functor. + */ + , public __stlport_class<less<_Tp> > +#endif +{ + bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } + +#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) + void _M_swap_workaround(less<_Tp>& __x) {} +#endif +}; + +#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) +template <class _Tp> +struct __type_traits<less<_Tp> > { +#if !defined (__BORLANDC__) + typedef typename _IsSTLportClass<less<_Tp> >::_Ret _STLportLess; +#else + enum { _Is = _IsSTLportClass<less<_Tp> >::_Is }; + typedef typename __bool2type<_Is>::_Ret _STLportLess; +#endif + typedef _STLportLess has_trivial_default_constructor; + typedef _STLportLess has_trivial_copy_constructor; + typedef _STLportLess has_trivial_assignment_operator; + typedef _STLportLess has_trivial_destructor; + typedef _STLportLess is_POD_type; +}; +#endif + +_STLP_MOVE_TO_PRIV_NAMESPACE + +template <class _Tp> +less<_Tp> __less(_Tp* ) { return less<_Tp>(); } + +template <class _Tp> +equal_to<_Tp> __equal_to(_Tp* ) { return equal_to<_Tp>(); } + +_STLP_MOVE_TO_STD_NAMESPACE + +template <class _Tp> +struct plus : public binary_function<_Tp, _Tp, _Tp> { + _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; } +}; + +template <class _Tp> +struct minus : public binary_function<_Tp, _Tp, _Tp> { + _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; } +}; + +_STLP_MOVE_TO_PRIV_NAMESPACE + +template <class _Tp> +plus<_Tp> __plus(_Tp* ) { return plus<_Tp>(); } + +template <class _Tp> +minus<_Tp> __minus(_Tp* ) { return minus<_Tp>(); } + +_STLP_MOVE_TO_STD_NAMESPACE + +template <class _Tp> +struct multiplies : public binary_function<_Tp, _Tp, _Tp> { + _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; } +}; + +_STLP_MOVE_TO_PRIV_NAMESPACE + +template <class _Pair> +struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { + const typename _Pair::first_type& operator()(const _Pair& __x) const { + return __x.first; + } +}; + +template <class _Pair> +struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type> { + const typename _Pair::second_type& operator()(const _Pair& __x) const { + return __x.second; + } +}; + +// project1st and project2nd are extensions: they are not part of the standard +template <class _Arg1, class _Arg2> +struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> { + _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; } +}; + +template <class _Arg1, class _Arg2> +struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> { + _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; } +}; + +#if defined (_STLP_MULTI_CONST_TEMPLATE_ARG_BUG) +// fbp : sort of select1st just for maps +template <class _Pair, class _Whatever> +// JDJ (CW Pro1 doesn't like const when first_type is also const) +struct __Select1st_hint : public unary_function<_Pair, _Whatever> { + const _Whatever& operator () (const _Pair& __x) const { return __x.first; } +}; +# define _STLP_SELECT1ST(__x,__y) _STLP_PRIV __Select1st_hint< __x, __y > +#else +# define _STLP_SELECT1ST(__x, __y) _STLP_PRIV _Select1st< __x > +#endif + +template <class _Tp> +struct _Identity : public unary_function<_Tp,_Tp> { + const _Tp& operator()(const _Tp& __x) const { return __x; } +}; + +template <class _Result, class _Argument> +struct _Constant_unary_fun { + typedef _Argument argument_type; + typedef _Result result_type; + result_type _M_val; + + _Constant_unary_fun(const result_type& __v) : _M_val(__v) {} + const result_type& operator()(const _Argument&) const { return _M_val; } +}; + +template <class _Result, class _Arg1, class _Arg2> +struct _Constant_binary_fun { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; + _Result _M_val; + + _Constant_binary_fun(const _Result& __v) : _M_val(__v) {} + const result_type& operator()(const _Arg1&, const _Arg2&) const { + return _M_val; + } +}; + +// identity_element (not part of the C++ standard). +template <class _Tp> inline _Tp __identity_element(plus<_Tp>) { return _Tp(0); } +template <class _Tp> inline _Tp __identity_element(multiplies<_Tp>) { return _Tp(1); } + +_STLP_MOVE_TO_STD_NAMESPACE + +_STLP_END_NAMESPACE + +#endif /* _STLP_INTERNAL_FUNCTION_BASE_H */ + +// Local Variables: +// mode:C++ +// End: |