llarp/util/str.hpp

Namespaces

Name
llarp
[crypto.hpp]

Classes

Name
struct llarp::CaselessLessThan

Source code

#pragma once

#include <string_view>
#include <vector>
#include <chrono>
#include <iterator>
#include <charconv>
#include <fmt/format.h>
#include <fmt/ranges.h>

namespace llarp
{
  bool
  IsFalseValue(std::string_view str);

  struct CaselessLessThan
  {
    bool
    operator()(std::string_view lhs, std::string_view rhs) const;
  };

  bool
  IsTrueValue(std::string_view str);

  [[nodiscard]] std::string_view
  TrimWhitespace(std::string_view str);

  using namespace std::literals;

  inline bool
  string_iequal(std::string_view s1, std::string_view s2)
  {
    return std::equal(s1.begin(), s1.end(), s2.begin(), s2.end(), [](char a, char b) {
      return std::tolower(static_cast<unsigned char>(a))
          == std::tolower(static_cast<unsigned char>(b));
    });
  }

  template <typename S1, typename... S>
  bool
  string_iequal_any(const S1& s1, const S&... s)
  {
    return (... || string_iequal(s1, s));
  }

  inline constexpr bool
  starts_with(std::string_view str, std::string_view prefix)
  {
    return str.substr(0, prefix.size()) == prefix;
  }

  inline constexpr bool
  ends_with(std::string_view str, std::string_view suffix)
  {
    return str.size() >= suffix.size() && str.substr(str.size() - suffix.size()) == suffix;
  }

  inline constexpr std::string_view
  strip_prefix(std::string_view str, std::string_view prefix)
  {
    if (starts_with(str, prefix))
      return str.substr(prefix.size());
    return str;
  }

  std::vector<std::string_view>
  split(std::string_view str, std::string_view delim, bool trim = false);

  std::vector<std::string_view>
  split_any(std::string_view str, std::string_view delims, bool trim = false);

  template <typename It>
  std::string
  join(std::string_view delimiter, It begin, It end)
  {
    return fmt::format("{}", fmt::join(begin, end, delimiter));
  }

  template <typename Container>
  std::string
  join(std::string_view delimiter, const Container& c)
  {
    return join(delimiter, c.begin(), c.end());
  }

  void
  trim(std::string_view& s);

  template <typename T>
  bool
  parse_int(const std::string_view str, T& value, int base = 10)
  {
    T tmp;
    auto* strend = str.data() + str.size();
    auto [p, ec] = std::from_chars(str.data(), strend, tmp, base);
    if (ec != std::errc() || p != strend)
      return false;
    value = tmp;
    return true;
  }

  std::string
  lowercase_ascii_string(std::string src);

  std::string
  friendly_duration(std::chrono::nanoseconds dur);

  std::wstring
  to_wide(std::string data);

}  // namespace llarp

Updated on 2026-01-10 at 22:49:46 +0000