diff options
-rw-r--r-- | libcxx/include/type_traits | 65 | ||||
-rw-r--r-- | libcxx/test/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp | 2 | ||||
-rw-r--r-- | libcxx/www/libcxx_by_chapter.pdf | bin | 32843 -> 35644 bytes |
3 files changed, 66 insertions, 1 deletions
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index 35777c8e183..653809cb93e 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -1321,6 +1321,71 @@ public: typedef decltype(declval<_Fn>()(declval<_ArgTypes>()...)) type; }; +#if 0 + +template <class _MP, class _Tp, class ..._Args> +struct __result_of_mp; + +// member function pointer + +template <class _R, class _Class, class _Tp, class ..._Params, class ..._Args> +struct __result_of_mp<_R (_Class::*)(_Params...), _Tp, _Args...> +{ + typedef _R type; +}; + +template <class _R, class _Class, class _Tp, class ..._Params, class ..._Args> +struct __result_of_mp<_R (_Class::*)(_Params...) const, _Tp, _Args...> +{ + typedef _R type; +}; + +template <class _R, class _Class, class _Tp, class ..._Params, class ..._Args> +struct __result_of_mp<_R (_Class::*)(_Params...) volatile, _Tp, _Args...> +{ + typedef _R type; +}; + +template <class _R, class _Class, class _Tp, class ..._Params, class ..._Args> +struct __result_of_mp<_R (_Class::*)(_Params...) const volatile, _Tp, _Args...> +{ + typedef _R type; +}; + +// member data pointer + +template <class _MP, class _Tp, bool> +struct __result_of_mdp; + +template <class _R, class _Class, class _Tp> +struct __result_of_mdp<_R _Class::*, _Tp, false> +{ + typedef typename __apply_cv<decltype(*_STD::declval<_Tp>()), _R>::type type; +}; + +template <class _R, class _Class, class _Tp> +struct __result_of_mdp<_R _Class::*, _Tp, true> +{ + typedef typename __apply_cv<_Tp, _R>::type&& type; +}; + +template <class _R, class _Class, class _Tp> +struct __result_of_mp<_R _Class::*, _Tp> + : public __result_of_mdp<_R _Class::*, _Tp, + is_base_of<_Class, typename remove_reference<_Tp>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class ..._ArgTypes> +class __result_of<_Fn(_Tp, _ArgTypes...), false> // _Fn must be member pointer + : public __result_of_mp<_Fn, _Tp, _ArgTypes...> +{ +}; + +#endif + +// result_of + template <class _Fn, class ..._ArgTypes> class result_of<_Fn(_ArgTypes...)> : public __result_of<_Fn(_ArgTypes...), diff --git a/libcxx/test/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp b/libcxx/test/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp index 3795f8e31ce..b1468de648a 100644 --- a/libcxx/test/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp +++ b/libcxx/test/utilities/meta/meta.trans/meta.trans.other/result_of.pass.cpp @@ -1 +1 @@ -//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <functional>
// result_of<Fn(ArgTypes...)>
#include <type_traits>
typedef bool (&PF1)();
typedef short (*PF2)(long);
struct S
{
operator PF2() const;
double operator()(char, int&);
};
int main()
{
static_assert((std::is_same<std::result_of<S(int)>::type, short>::value), "Error!");
static_assert((std::is_same<std::result_of<S&(unsigned char, int&)>::type, double>::value), "Error!");
static_assert((std::is_same<std::result_of<PF1()>::type, bool>::value), "Error!");
}
\ No newline at end of file +//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <functional>
// result_of<Fn(ArgTypes...)>
#include <type_traits>
#include <memory>
typedef bool (&PF1)();
typedef short (*PF2)(long);
struct S
{
operator PF2() const;
double operator()(char, int&);
void calc(long) const;
char data_;
};
typedef void (S::*PMS)(long) const;
typedef char S::*PMD;
int main()
{
static_assert((std::is_same<std::result_of<S(int)>::type, short>::value), "Error!");
static_assert((std::is_same<std::result_of<S&(unsigned char, int&)>::type, double>::value), "Error!");
static_assert((std::is_same<std::result_of<PF1()>::type, bool>::value), "Error!");
// static_assert(std::is_same<std::result_of<PMS(std::unique_ptr<S>, int)>::type, void>::value, "Error!");
// static_assert(std::is_same<std::result_of<PMD(S)>::type, char&&>::value, "Error!");
// static_assert(std::is_same<std::result_of<PMD(const S*)>::type, const char&>::value, "Error!");
}
\ No newline at end of file diff --git a/libcxx/www/libcxx_by_chapter.pdf b/libcxx/www/libcxx_by_chapter.pdf Binary files differindex 8a03784f413..b460d2e8fba 100644 --- a/libcxx/www/libcxx_by_chapter.pdf +++ b/libcxx/www/libcxx_by_chapter.pdf |