Nix 2.93.3
Lix: A modern, delicious implementation of the Nix package manager; unstable internal interfaces
Loading...
Searching...
No Matches
backed-string-view.hh
1#pragma once
3#include <variant>
4#include <string>
5#include <string_view>
6
17class BackedStringView {
18private:
19 std::variant<std::string, std::string_view> data;
20
26 class Ptr {
27 private:
28 std::string_view view;
29 public:
30 Ptr(std::string_view view): view(view) {}
31 const std::string_view * operator->() const { return &view; }
32 };
33
34public:
35 BackedStringView(std::string && s): data(std::move(s)) {}
36 BackedStringView(std::string_view sv): data(sv) {}
37 template<size_t N>
38 BackedStringView(const char (& lit)[N]): data(std::string_view(lit)) {}
39
40 BackedStringView(const BackedStringView &) = delete;
41 BackedStringView & operator=(const BackedStringView &) = delete;
42
47 BackedStringView(BackedStringView && other) = default;
48 BackedStringView & operator=(BackedStringView && other) = default;
49
50 bool isOwned() const
51 {
52 return std::holds_alternative<std::string>(data);
53 }
54
55 std::string toOwned() &&
56 {
57 return isOwned()
58 ? std::move(std::get<std::string>(data))
59 : std::string(std::get<std::string_view>(data));
60 }
61
62 std::string_view operator*() const
63 {
64 return isOwned()
65 ? std::get<std::string>(data)
66 : std::get<std::string_view>(data);
67 }
68 Ptr operator->() const { return Ptr(**this); }
69};
BackedStringView(BackedStringView &&other)=default