6#include "detail/span.h"
31 template<
typename... B,
32 std::enable_if_t<std::is_same_v<std::common_type_t<B...>, std::vector<uint8_t>>,
bool> =
true>
35 static_assert(
sizeof...(B) >= 1,
"Track namespace must have at least 1 entry");
36 static_assert(
sizeof...(B) <= 32 - 1,
"Track namespace can only have a maximum of 32 entries");
38 std::size_t offset = 0;
39 const auto add_entry = [&](
auto&& e) {
40 const auto& entry = entries_.emplace_back(Span{ bytes_ }.subspan(offset, e.size()));
41 hash_.emplace_back(quicr::hash({ entry.begin(), entry.end() }));
46 (bytes_.insert(bytes_.end(), entries.begin(), entries.end()), ...);
47 (add_entry(entries), ...);
56 template<
typename... S, std::enable_if_t<std::is_same_v<std::common_type_t<S...>, std::string>,
bool> =
true>
59 static_assert(
sizeof...(S) >= 1,
"Track namespace must have at least 1 entry");
60 static_assert(
sizeof...(S) <= 32 - 1,
"Track namespace can only have a maximum of 32 entries");
62 std::size_t offset = 0;
63 const auto add_entry = [&](
auto&& e) {
64 const auto& entry = entries_.emplace_back(Span{ bytes_ }.subspan(offset, e.size()));
65 hash_.emplace_back(quicr::hash({ entry.begin(), entry.end() }));
69 (bytes_.insert(bytes_.end(), entries.begin(), entries.end()), ...);
70 (add_entry(entries), ...);
74 : entries_(entries.
size())
76 if (entries.size() > 32 || entries.size() == 0) {
77 throw std::invalid_argument(
"TrackNamespace requires a number of entries in the range of [1, 32]");
80 for (
auto& entry : entries) {
81 bytes_.insert(bytes_.end(), entry.begin(), entry.end());
84 std::size_t offset = 0;
86 for (
auto& entry : entries) {
87 entries_[i] = Span{ bytes_ }.subspan(offset, entry.size());
88 hash_.emplace_back(quicr::hash(entry));
89 offset += entry.size();
95 : entries_(entries.
size())
97 if (entries.size() > 32 || entries.size() == 0) {
98 throw std::invalid_argument(
"TrackNamespace requires a number of entries in the range of [1, 32]");
101 for (
auto& entry : entries) {
102 bytes_.insert(bytes_.end(), entry.begin(), entry.end());
105 std::size_t offset = 0;
107 for (
auto& entry : entries) {
108 entries_[i] = Span{ bytes_ }.subspan(offset, entry.size());
109 hash_.emplace_back(quicr::hash(entries_[i]));
110 offset += entry.size();
116 : bytes_(other.bytes_)
117 , entries_(other.entries_)
120 std::size_t offset = 0;
122 for (
auto& entry : entries_) {
123 entries_[i++] = Span{ bytes_ }.subspan(offset, entry.size());
124 offset += entry.size();
129 : bytes_(std::move(other.bytes_))
130 , entries_(std::move(other.entries_))
131 , hash_(std::move(other.hash_))
133 other.entries_.clear();
135 std::size_t offset = 0;
137 for (
auto& entry : entries_) {
138 entries_[i++] = Span{ bytes_ }.subspan(offset, entry.size());
139 offset += entry.size();
145 this->bytes_ = other.bytes_;
146 this->entries_ = other.entries_;
147 this->hash_ = other.hash_;
149 std::size_t offset = 0;
151 for (
auto& entry : entries_) {
152 entries_[i++] = Span{ bytes_ }.subspan(offset, entry.size());
153 offset += entry.size();
161 this->bytes_ = std::move(other.bytes_);
162 this->entries_ = std::move(other.entries_);
163 this->hash_ = std::move(other.hash_);
165 std::size_t offset = 0;
167 for (
auto& entry : entries_) {
168 entries_[i++] = Span{ bytes_ }.subspan(offset, entry.size());
169 offset += entry.size();
175 const std::vector<Span<const uint8_t>>&
GetEntries() const noexcept {
return entries_; }
176 const auto&
GetHashes() const noexcept {
return hash_; }
179 auto begin() noexcept {
return bytes_.begin(); }
180 auto end() noexcept {
return bytes_.end(); }
181 auto begin() const noexcept {
return bytes_.begin(); }
182 auto end() const noexcept {
return bytes_.end(); }
183 auto data() const noexcept {
return bytes_.data(); }
184 auto size() const noexcept {
return bytes_.size(); }
185 bool empty() const noexcept {
return bytes_.empty(); }
190 return lhs.bytes_ == rhs.bytes_;
197 return lhs.bytes_ < rhs.bytes_;
202 return lhs.bytes_ > rhs.bytes_;
211 if (this->hash_.size() > other.hash_.size()) {
215 for (
size_t i = 0; i < this->hash_.size(); i++) {
216 if (this->hash_[i] != other.hash_[i]) {
226 const std::size_t prefix_size = std::min(this->hash_.size(), other.hash_.size());
227 for (
size_t i = 0; i < prefix_size; i++) {
228 if (this->hash_[i] != other.hash_[i]) {
237 uint64_t hash() const noexcept {
return quicr::hash(bytes_); }
240 std::vector<uint8_t> bytes_;
241 std::vector<Span<const uint8_t>> entries_;
242 std::vector<std::size_t> hash_;
249struct std::hash<quicr::TrackNamespace>
280 TrackHash(
const uint64_t name_space,
const uint64_t name) noexcept
An N-tuple representation of a MOQ namespace.
Definition track_name.h:21
TrackNamespace(S &&... entries)
Constructs a namespace from a variadic number of string parameters.
Definition track_name.h:57
const auto & GetHashes() const noexcept
Definition track_name.h:176
auto data() const noexcept
Definition track_name.h:183
TrackNamespace(const std::vector< std::vector< uint8_t > > &entries)
Definition track_name.h:73
bool IsPrefixOf(const TrackNamespace &other) const noexcept
Definition track_name.h:209
TrackNamespace(const std::vector< std::string > &entries)
Definition track_name.h:94
friend bool operator==(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:188
auto size() const noexcept
Definition track_name.h:184
TrackNamespace & operator=(const TrackNamespace &other)
Definition track_name.h:143
bool empty() const noexcept
Definition track_name.h:185
friend bool operator>(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:200
friend bool operator!=(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:193
bool HasSamePrefix(const TrackNamespace &other) const noexcept
Definition track_name.h:224
friend bool operator<=(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:205
friend bool operator<(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:195
auto end() const noexcept
Definition track_name.h:182
friend bool operator>=(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:207
TrackNamespace(TrackNamespace &&other)
Definition track_name.h:128
const std::vector< Span< const uint8_t > > & GetEntries() const noexcept
Definition track_name.h:175
TrackNamespace(B &&... entries)
Constructs a namespace from a variadic number of Bytes parameters.
Definition track_name.h:33
TrackNamespace & operator=(TrackNamespace &&other)
Definition track_name.h:159
auto begin() noexcept
Definition track_name.h:179
TrackNamespace(const TrackNamespace &other)
Definition track_name.h:115
auto begin() const noexcept
Definition track_name.h:181
auto end() noexcept
Definition track_name.h:180
Definition transport.h:26
uint64_t TrackNameHash
Definition track_name.h:257
uint64_t TrackFullNameHash
Definition track_name.h:258
uint64_t TrackNamespaceHash
Definition track_name.h:256
void hash_combine(uint64_t &existing_hash, const uint64_t &add_hash)
Combine (aka add) hash to existing hash.
Definition hash.h:91
Full track name struct.
Definition track_name.h:267
std::vector< uint8_t > name
Definition track_name.h:269
TrackNamespace name_space
Definition track_name.h:268
std::optional< uint64_t > track_alias
Definition track_name.h:270
Definition track_name.h:274
uint64_t track_fullname_hash
Definition track_name.h:278
TrackNamespaceHash track_namespace_hash
Definition track_name.h:275
TrackHash(const uint64_t name_space, const uint64_t name) noexcept
Definition track_name.h:280
TrackHash(const FullTrackName &ftn) noexcept
Definition track_name.h:291
TrackNameHash track_name_hash
Definition track_name.h:276
std::size_t operator()(const quicr::TrackNamespace &value) const noexcept
Definition track_name.h:251