|
- // -*- C++ -*-
- //===-- utils.h -----------------------------------------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
-
- #ifndef _PSTL_UTILS_H
- #define _PSTL_UTILS_H
-
- #include <new>
- #include <iterator>
-
- namespace __pstl
- {
- namespace __internal
- {
-
- template <typename _Fp>
- typename std::result_of<_Fp()>::type
- __except_handler(_Fp __f)
- {
- try
- {
- return __f();
- }
- catch (const std::bad_alloc&)
- {
- throw; // re-throw bad_alloc according to the standard [algorithms.parallel.exceptions]
- }
- catch (...)
- {
- std::terminate(); // Good bye according to the standard [algorithms.parallel.exceptions]
- }
- }
-
- template <typename _Fp>
- void
- __invoke_if(std::true_type, _Fp __f)
- {
- __f();
- }
-
- template <typename _Fp>
- void
- __invoke_if(std::false_type, _Fp __f)
- {
- }
-
- template <typename _Fp>
- void
- __invoke_if_not(std::false_type, _Fp __f)
- {
- __f();
- }
-
- template <typename _Fp>
- void
- __invoke_if_not(std::true_type, _Fp __f)
- {
- }
-
- template <typename _F1, typename _F2>
- typename std::result_of<_F1()>::type
- __invoke_if_else(std::true_type, _F1 __f1, _F2 __f2)
- {
- return __f1();
- }
-
- template <typename _F1, typename _F2>
- typename std::result_of<_F2()>::type
- __invoke_if_else(std::false_type, _F1 __f1, _F2 __f2)
- {
- return __f2();
- }
-
- //! Unary operator that returns reference to its argument.
- struct __no_op
- {
- template <typename _Tp>
- _Tp&&
- operator()(_Tp&& __a) const
- {
- return std::forward<_Tp>(__a);
- }
- };
-
- //! Logical negation of a predicate
- template <typename _Pred>
- class __not_pred
- {
- _Pred _M_pred;
-
- public:
- explicit __not_pred(_Pred __pred) : _M_pred(__pred) {}
-
- template <typename... _Args>
- bool
- operator()(_Args&&... __args)
- {
- return !_M_pred(std::forward<_Args>(__args)...);
- }
- };
-
- template <typename _Pred>
- class __reorder_pred
- {
- _Pred _M_pred;
-
- public:
- explicit __reorder_pred(_Pred __pred) : _M_pred(__pred) {}
-
- template <typename _FTp, typename _STp>
- bool
- operator()(_FTp&& __a, _STp&& __b)
- {
- return _M_pred(std::forward<_STp>(__b), std::forward<_FTp>(__a));
- }
- };
-
- //! "==" comparison.
- /** Not called "equal" to avoid (possibly unfounded) concerns about accidental invocation via
- argument-dependent name lookup by code expecting to find the usual std::equal. */
- class __pstl_equal
- {
- public:
- explicit __pstl_equal() {}
-
- template <typename _Xp, typename _Yp>
- bool
- operator()(_Xp&& __x, _Yp&& __y) const
- {
- return std::forward<_Xp>(__x) == std::forward<_Yp>(__y);
- }
- };
-
- //! "<" comparison.
- class __pstl_less
- {
- public:
- explicit __pstl_less() {}
-
- template <typename _Xp, typename _Yp>
- bool
- operator()(_Xp&& __x, _Yp&& __y) const
- {
- return std::forward<_Xp>(__x) < std::forward<_Yp>(__y);
- }
- };
-
- //! Like a polymorphic lambda for pred(...,value)
- template <typename _Tp, typename _Predicate>
- class __equal_value_by_pred
- {
- const _Tp& _M_value;
- _Predicate _M_pred;
-
- public:
- __equal_value_by_pred(const _Tp& __value, _Predicate __pred) : _M_value(__value), _M_pred(__pred) {}
-
- template <typename _Arg>
- bool
- operator()(_Arg&& __arg)
- {
- return _M_pred(std::forward<_Arg>(__arg), _M_value);
- }
- };
-
- //! Like a polymorphic lambda for ==value
- template <typename _Tp>
- class __equal_value
- {
- const _Tp& _M_value;
-
- public:
- explicit __equal_value(const _Tp& __value) : _M_value(__value) {}
-
- template <typename _Arg>
- bool
- operator()(_Arg&& __arg) const
- {
- return std::forward<_Arg>(__arg) == _M_value;
- }
- };
-
- //! Logical negation of ==value
- template <typename _Tp>
- class __not_equal_value
- {
- const _Tp& _M_value;
-
- public:
- explicit __not_equal_value(const _Tp& __value) : _M_value(__value) {}
-
- template <typename _Arg>
- bool
- operator()(_Arg&& __arg) const
- {
- return !(std::forward<_Arg>(__arg) == _M_value);
- }
- };
-
- template <typename _ForwardIterator, typename _Compare>
- _ForwardIterator
- __cmp_iterators_by_values(_ForwardIterator __a, _ForwardIterator __b, _Compare __comp)
- {
- if (__a < __b)
- { // we should return closer iterator
- return __comp(*__b, *__a) ? __b : __a;
- }
- else
- {
- return __comp(*__a, *__b) ? __a : __b;
- }
- }
-
- } // namespace __internal
- } // namespace __pstl
-
- #endif /* _PSTL_UTILS_H */
|