// Copyright 2018 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 BASE_STRINGS_CHAR_TRAITS_H_
#define BASE_STRINGS_CHAR_TRAITS_H_

#include "base/compiler_specific.h"
#include "base/cpp14oncpp11.h"
#include "starboard/types.h"

namespace base {

// constexpr version of http://en.cppreference.com/w/cpp/string/char_traits.
// This currently just implements the bits needed to support a (mostly)
// constexpr StringPiece.
//
// TODO(dcheng): Once we switch to C++17, most methods will become constexpr and
// we can switch over to using the one in the standard library.
template <typename T>
struct CharTraits {
  // Performs a lexographical comparison of the first N characters of |s1| and
  // |s2|. Returns 0 if equal, -1 if |s1| is less than |s2|, and 1 if |s1| is
  // greater than |s2|.
  static CONSTEXPR int compare(const T* s1, const T* s2, size_t n) noexcept;
  // Returns the length of |s|, assuming null termination (and not including the
  // terminating null).
  static CONSTEXPR size_t length(const T* s) noexcept;
};

template <typename T>
CONSTEXPR int CharTraits<T>::compare(const T* s1,
                                     const T* s2,
                                     size_t n) noexcept {
  for (; n; --n, ++s1, ++s2) {
    if (*s1 < *s2)
      return -1;
    if (*s1 > *s2)
      return 1;
  }
  return 0;
}

template <typename T>
CONSTEXPR size_t CharTraits<T>::length(const T* s) noexcept {
  size_t i = 0;
  for (; *s; ++s)
    ++i;
  return i;
}

// char specialization of CharTraits that can use clang's constexpr instrinsics,
// where available.
#if defined(STARBOARD)
template <>
struct CharTraits<char> {
  CONSTEXPR static int compare(const char* s1,
                               const char* s2,
                               size_t n) noexcept {
    for (; n; --n, ++s1, ++s2) {
      if (*s1 < *s2)
        return -1;
      if (*s1 > *s2)
        return 1;
    }
    return 0;
  }

  CONSTEXPR static size_t length(const char* s) noexcept {
    size_t i = 0;
    for (; *s; ++s)
      ++i;
    return i;
  }
};
#else
template <>
struct CharTraits<char> {
  static constexpr int compare(const char* s1,
                               const char* s2,
                               size_t n) noexcept;
  static constexpr size_t length(const char* s) noexcept;
};

constexpr int CharTraits<char>::compare(const char* s1,
                                        const char* s2,
                                        size_t n) noexcept {
#if HAS_FEATURE(cxx_constexpr_string_builtins)
  return __builtin_memcmp(s1, s2, n);
#else
  for (; n; --n, ++s1, ++s2) {
    if (*s1 < *s2)
      return -1;
    if (*s1 > *s2)
      return 1;
  }
  return 0;
#endif
}

constexpr size_t CharTraits<char>::length(const char* s) noexcept {
#if defined(__clang__)
  return __builtin_strlen(s);
#else
  size_t i = 0;
  for (; *s; ++s)
    ++i;
  return i;
#endif
}
#endif

}  // namespace base

#endif  // BASE_STRINGS_CHAR_TRAITS_H_
