summaryrefslogtreecommitdiffstats
path: root/server/src/util.cpp
blob: 54040a6724bac4d68c6e8ce7cb0639f43e1e0894 (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
module routemon:util$impl;

import :util;

namespace routemon::util {

lazy_zstring_view::lazy_zstring_view(lazy_zstring_view const& sv) noexcept
  : s_{sv.s_}, length_{sv.length_.load(std::memory_order_acquire)}
{
}

lazy_zstring_view::lazy_zstring_view(lazy_zstring_view&& sv) noexcept
  : s_{sv.s_}, length_{sv.length_.load(std::memory_order_acquire)}
{
}

auto lazy_zstring_view::operator=(lazy_zstring_view const& rhs) noexcept
    -> lazy_zstring_view&
{
  if (this != &rhs)
  {
    s_ = rhs.s_;
    length_.store(
        rhs.length_.load(std::memory_order_acquire), std::memory_order_release);
  }
  return *this;
}

auto lazy_zstring_view::operator=(lazy_zstring_view&& rhs) noexcept
    -> lazy_zstring_view&
{
  return *this = rhs; // use the copy assignment operator
}

auto lazy_zstring_view::length() const noexcept -> std::size_t
{
  if (auto v = length_.load(std::memory_order_acquire); v != unset_length)
    return v;
  auto l = std::char_traits<char>::length(s_);
  length_.store(l, std::memory_order_release);
  return l;
}

auto lazy_zstring_view::c_str() const noexcept -> char const* { return s_; }

lazy_zstring_view::operator std::string_view() const noexcept
{
  return std::string_view{s_, length()};
}

lazy_zstring_view::operator char const*() const noexcept { return s_; }

auto lazy_zstring_view::operator==(std::string_view sv) const noexcept -> bool
{
  if (auto v = length_.load(std::memory_order_acquire); v != unset_length)
    if (sv.length() != v)
      return false;
  auto res = std::char_traits<char>::compare(s_, sv.data(), sv.length());
  if (res != 0)
    return false;
  // Strings are equal for sv.length() characters.
  if (s_[sv.length()] != '\0')
    return false;
  // Strings are actually equal, and we have just found out the
  // length of this string, so we might as well set it.
  length_.store(sv.length(), std::memory_order_release);
  return true;
}

auto operator==(zstring_view lhs, zstring_view rhs) -> bool
{
  return std::string_view{lhs} == std::string_view{rhs};
}

} // namespace routemon::util