Const qualify __mem_fn call operator

QOI improvement.

Differential Revision: http://llvm-reviews.chandlerc.com/D2059

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@199848 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Peter Collingbourne 2014-01-22 22:56:52 +00:00
parent 15066f21f1
commit a4c0d87a84
7 changed files with 31 additions and 5 deletions

View File

@ -33,28 +33,28 @@ public:
// invoke // invoke
typename __invoke_return<type>::type typename __invoke_return<type>::type
operator() () operator() () const
{ {
return __invoke(__f_); return __invoke(__f_);
} }
template <class _A0> template <class _A0>
typename __invoke_return0<type, _A0>::type typename __invoke_return0<type, _A0>::type
operator() (_A0& __a0) operator() (_A0& __a0) const
{ {
return __invoke(__f_, __a0); return __invoke(__f_, __a0);
} }
template <class _A0, class _A1> template <class _A0, class _A1>
typename __invoke_return1<type, _A0, _A1>::type typename __invoke_return1<type, _A0, _A1>::type
operator() (_A0& __a0, _A1& __a1) operator() (_A0& __a0, _A1& __a1) const
{ {
return __invoke(__f_, __a0, __a1); return __invoke(__f_, __a0, __a1);
} }
template <class _A0, class _A1, class _A2> template <class _A0, class _A1, class _A2>
typename __invoke_return2<type, _A0, _A1, _A2>::type typename __invoke_return2<type, _A0, _A1, _A2>::type
operator() (_A0& __a0, _A1& __a1, _A2& __a2) operator() (_A0& __a0, _A1& __a1, _A2& __a2) const
{ {
return __invoke(__f_, __a0, __a1, __a2); return __invoke(__f_, __a0, __a1, __a2);
} }

View File

@ -1221,7 +1221,7 @@ public:
template <class... _ArgTypes> template <class... _ArgTypes>
_LIBCPP_INLINE_VISIBILITY _LIBCPP_INLINE_VISIBILITY
typename __invoke_return<type, _ArgTypes...>::type typename __invoke_return<type, _ArgTypes...>::type
operator() (_ArgTypes&&... __args) operator() (_ArgTypes&&... __args) const
{ {
return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...); return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
} }

View File

@ -32,6 +32,8 @@ test(F f)
assert(a.data_ == 6); assert(a.data_ == 6);
const A* cap = ap; const A* cap = ap;
assert(f(cap) == f(ap)); assert(f(cap) == f(ap));
const F& cf = f;
assert(cf(ap) == f(ap));
} }
} }

View File

@ -31,6 +31,8 @@ test0(F f)
assert(f(a) == 'a'); assert(f(a) == 'a');
A* ap = &a; A* ap = &a;
assert(f(ap) == 'a'); assert(f(ap) == 'a');
const F& cf = f;
assert(cf(ap) == 'a');
} }
} }
@ -43,6 +45,8 @@ test1(F f)
assert(f(a, 1) == 'b'); assert(f(a, 1) == 'b');
A* ap = &a; A* ap = &a;
assert(f(ap, 2) == 'b'); assert(f(ap, 2) == 'b');
const F& cf = f;
assert(cf(ap, 2) == 'b');
} }
} }
@ -55,6 +59,8 @@ test2(F f)
assert(f(a, 1, 2) == 'c'); assert(f(a, 1, 2) == 'c');
A* ap = &a; A* ap = &a;
assert(f(ap, 2, 3.5) == 'c'); assert(f(ap, 2, 3.5) == 'c');
const F& cf = f;
assert(cf(ap, 2, 3.5) == 'c');
} }
} }

View File

@ -33,6 +33,8 @@ test0(F f)
assert(f(ap) == 'a'); assert(f(ap) == 'a');
const A* cap = &a; const A* cap = &a;
assert(f(cap) == 'a'); assert(f(cap) == 'a');
const F& cf = f;
assert(cf(ap) == 'a');
} }
} }
@ -47,6 +49,8 @@ test1(F f)
assert(f(ap, 2) == 'b'); assert(f(ap, 2) == 'b');
const A* cap = &a; const A* cap = &a;
assert(f(cap, 2) == 'b'); assert(f(cap, 2) == 'b');
const F& cf = f;
assert(cf(ap, 2) == 'b');
} }
} }
@ -61,6 +65,8 @@ test2(F f)
assert(f(ap, 2, 3.5) == 'c'); assert(f(ap, 2, 3.5) == 'c');
const A* cap = &a; const A* cap = &a;
assert(f(cap, 2, 3.5) == 'c'); assert(f(cap, 2, 3.5) == 'c');
const F& cf = f;
assert(cf(ap, 2, 3.5) == 'c');
} }
} }

View File

@ -33,6 +33,8 @@ test0(F f)
assert(f(ap) == 'a'); assert(f(ap) == 'a');
const volatile A* cap = &a; const volatile A* cap = &a;
assert(f(cap) == 'a'); assert(f(cap) == 'a');
const F& cf = f;
assert(cf(ap) == 'a');
} }
} }
@ -47,6 +49,8 @@ test1(F f)
assert(f(ap, 2) == 'b'); assert(f(ap, 2) == 'b');
const volatile A* cap = &a; const volatile A* cap = &a;
assert(f(cap, 2) == 'b'); assert(f(cap, 2) == 'b');
const F& cf = f;
assert(cf(ap, 2) == 'b');
} }
} }
@ -61,6 +65,8 @@ test2(F f)
assert(f(ap, 2, 3.5) == 'c'); assert(f(ap, 2, 3.5) == 'c');
const volatile A* cap = &a; const volatile A* cap = &a;
assert(f(cap, 2, 3.5) == 'c'); assert(f(cap, 2, 3.5) == 'c');
const F& cf = f;
assert(cf(ap, 2, 3.5) == 'c');
} }
} }

View File

@ -33,6 +33,8 @@ test0(F f)
assert(f(ap) == 'a'); assert(f(ap) == 'a');
volatile A* cap = &a; volatile A* cap = &a;
assert(f(cap) == 'a'); assert(f(cap) == 'a');
const F& cf = f;
assert(cf(ap) == 'a');
} }
} }
@ -47,6 +49,8 @@ test1(F f)
assert(f(ap, 2) == 'b'); assert(f(ap, 2) == 'b');
volatile A* cap = &a; volatile A* cap = &a;
assert(f(cap, 2) == 'b'); assert(f(cap, 2) == 'b');
const F& cf = f;
assert(cf(ap, 2) == 'b');
} }
} }
@ -61,6 +65,8 @@ test2(F f)
assert(f(ap, 2, 3.5) == 'c'); assert(f(ap, 2, 3.5) == 'c');
volatile A* cap = &a; volatile A* cap = &a;
assert(f(cap, 2, 3.5) == 'c'); assert(f(cap, 2, 3.5) == 'c');
const F& cf = f;
assert(cf(ap, 2, 3.5) == 'c');
} }
} }