// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

export namespace std {
  // [func.invoke], invoke
  using std::invoke;
#if _LIBCPP_STD_VER >= 23
  using std::invoke_r;
#endif

#if _LIBCPP_STD_VER >= 20
  using std::basic_common_reference;
#endif

  // [refwrap], reference_wrapper
  using std::reference_wrapper;

  using std::cref;
  using std::ref;

  // [arithmetic.operations], arithmetic operations
  using std::divides;
  using std::minus;
  using std::modulus;
  using std::multiplies;
  using std::negate;
  using std::plus;
  // [comparisons], comparisons
  using std::equal_to;
  using std::greater;
  using std::greater_equal;
  using std::less;
  using std::less_equal;
  using std::not_equal_to;

  // [comparisons.three.way], class compare_three_way
  using std::compare_three_way;

  // [logical.operations], logical operations
  using std::logical_and;
  using std::logical_not;
  using std::logical_or;

  // [bitwise.operations], bitwise operations
  using std::bit_and;
  using std::bit_not;
  using std::bit_or;
  using std::bit_xor;

  // [func.identity], identity
  using std::identity;

  // [func.not.fn], function template not_fn
  using std::not_fn;

  // [func.bind.partial], function templates bind_front and bind_back
  using std::bind_front;
#if _LIBCPP_STD_VER >= 23
  using std::bind_back;
#endif

  // [func.bind], bind
  using std::is_bind_expression;
  using std::is_bind_expression_v;
  using std::is_placeholder;
  using std::is_placeholder_v;

  using std::bind;

  namespace placeholders {
    // M is the implementation-defined number of placeholders
    using std::placeholders::_1;
    using std::placeholders::_10;
    using std::placeholders::_2;
    using std::placeholders::_3;
    using std::placeholders::_4;
    using std::placeholders::_5;
    using std::placeholders::_6;
    using std::placeholders::_7;
    using std::placeholders::_8;
    using std::placeholders::_9;
  } // namespace placeholders

  // [func.memfn], member function adaptors
  using std::mem_fn;

  // [func.wrap], polymorphic function wrappers
  using std::bad_function_call;

  using std::function;

  using std::swap;

  using std::operator==;

  // [func.wrap.move], move only wrapper
  // using std::move_only_function;

  // [func.search], searchers
  using std::default_searcher;

  using std::boyer_moore_searcher;

  using std::boyer_moore_horspool_searcher;

  // [unord.hash], class template hash
  using std::hash;

  namespace ranges {
    // [range.cmp], concept-constrained comparisons
    using std::ranges::equal_to;
    using std::ranges::greater;
    using std::ranges::greater_equal;
    using std::ranges::less;
    using std::ranges::less_equal;
    using std::ranges::not_equal_to;
  } // namespace ranges
} // namespace std
