// Copyright 2020 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#pragma once

#include <limits.h>

namespace std {

template <typename T>
struct numeric_limits {
  static constexpr bool is_specialized = false;
};

// Only a few of the numeric_limits methods are implemented.
#define _PW_LIMITS_SPECIALIZATION(                               \
    type, val_signed, val_int, min_value, max_value)             \
  template <>                                                    \
  struct numeric_limits<type> {                                  \
    static constexpr bool is_specialized = true;                 \
                                                                 \
    static constexpr bool is_signed = (val_signed);              \
    static constexpr bool is_integer = (val_int);                \
                                                                 \
    static constexpr type min() noexcept { return (min_value); } \
    static constexpr type max() noexcept { return (max_value); } \
  }

#define _PW_INTEGRAL_LIMIT(type, sname, uname)            \
  _PW_LIMITS_SPECIALIZATION(                              \
      signed type, true, true, sname##_MIN, sname##_MAX); \
  _PW_LIMITS_SPECIALIZATION(unsigned type, false, true, 0u, uname##_MAX)

_PW_LIMITS_SPECIALIZATION(bool, false, true, false, true);
_PW_LIMITS_SPECIALIZATION(char, char(-1) < char(0), true, CHAR_MIN, CHAR_MAX);

_PW_INTEGRAL_LIMIT(char, SCHAR, UCHAR);
_PW_INTEGRAL_LIMIT(short, SHRT, USHRT);
_PW_INTEGRAL_LIMIT(int, INT, UINT);
_PW_INTEGRAL_LIMIT(long, LONG, ULONG);

#ifndef LLONG_MIN
#define LLONG_MIN ((long long)(~0ull ^ (~0ull >> 1)))
#define LLONG_MAX ((long long)(~0ull >> 1))

#define ULLONG_MIN (0ull)
#define ULLONG_MAX (~0ull)
#endif  // LLONG_MIN

_PW_INTEGRAL_LIMIT(long long, LLONG, ULLONG);

#undef _PW_LIMITS_SPECIALIZATION
#undef _PW_INTEGRAL_LIMIT

}  // namespace std
