// 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 "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_
