| // Copyright 2021 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef THIRD_PARTY_BASE_CXX17_BACKPORTS_H_ |
| #define THIRD_PARTY_BASE_CXX17_BACKPORTS_H_ |
| |
| #include <stddef.h> |
| |
| #include <functional> |
| |
| #include "third_party/base/check.h" |
| |
| namespace pdfium { |
| |
| // C++14 implementation of C++17's std::size(): |
| // http://en.cppreference.com/w/cpp/iterator/size |
| template <typename Container> |
| constexpr auto size(const Container& c) -> decltype(c.size()) { |
| return c.size(); |
| } |
| |
| template <typename T, size_t N> |
| constexpr size_t size(const T (&array)[N]) noexcept { |
| return N; |
| } |
| |
| // C++14 implementation of C++17's std::clamp(): |
| // https://en.cppreference.com/w/cpp/algorithm/clamp |
| // Please note that the C++ spec makes it undefined behavior to call std::clamp |
| // with a value of `lo` that compares greater than the value of `hi`. This |
| // implementation uses a CHECK to enforce this as a hard restriction. |
| template <typename T, typename Compare> |
| constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp) { |
| CHECK(!comp(hi, lo)); |
| return comp(v, lo) ? lo : comp(hi, v) ? hi : v; |
| } |
| |
| template <typename T> |
| constexpr const T& clamp(const T& v, const T& lo, const T& hi) { |
| return pdfium::clamp(v, lo, hi, std::less<T>{}); |
| } |
| |
| } // namespace pdfium |
| |
| #endif // THIRD_PARTY_BASE_CXX17_BACKPORTS_H_ |