30 template<
typename... B,
31 std::enable_if_t<std::is_same_v<std::common_type_t<B...>, std::vector<uint8_t>>,
bool> =
true>
34 static_assert(
sizeof...(B) >= 1,
"Track namespace must have at least 1 entry");
35 static_assert(
sizeof...(B) <= 32 - 1,
"Track namespace can only have a maximum of 32 entries");
37 std::size_t offset = 0;
38 const auto add_entry = [&](
auto&& e) {
39 const auto& entry = entries_.emplace_back(std::span{ bytes_ }.subspan(offset, e.size()));
40 hashes_.emplace_back(
quicr::hash({ entry.begin(), entry.end() }));
45 (bytes_.insert(bytes_.end(), entries.begin(), entries.end()), ...);
46 (add_entry(entries), ...);
55 template<
typename... S, std::enable_if_t<std::is_same_v<std::common_type_t<S...>, std::string>,
bool> =
true>
58 static_assert(
sizeof...(S) >= 1,
"Track namespace must have at least 1 entry");
59 static_assert(
sizeof...(S) <= 32 - 1,
"Track namespace can only have a maximum of 32 entries");
61 std::size_t offset = 0;
62 const auto add_entry = [&](
auto&& e) {
63 const auto& entry = entries_.emplace_back(std::span{ bytes_ }.subspan(offset, e.size()));
64 hashes_.emplace_back(
quicr::hash({ entry.begin(), entry.end() }));
68 (bytes_.insert(bytes_.end(), entries.begin(), entries.end()), ...);
69 (add_entry(entries), ...);
73 : entries_(entries.
size())
75 if (entries.size() > 32 || entries.size() == 0) {
76 throw std::invalid_argument(
"TrackNamespace requires a number of entries in the range of [1, 32]");
79 for (
auto& entry : entries) {
80 bytes_.insert(bytes_.end(), entry.begin(), entry.end());
83 std::size_t offset = 0;
85 for (
auto& entry : entries) {
86 entries_[i] = std::span{ bytes_ }.subspan(offset, entry.size());
88 offset += entry.size();
94 : entries_(entries.
size())
96 if (entries.size() > 32 || entries.size() == 0) {
97 throw std::invalid_argument(
"TrackNamespace requires a number of entries in the range of [1, 32]");
100 for (
auto& entry : entries) {
101 bytes_.insert(bytes_.end(), entry.begin(), entry.end());
104 std::size_t offset = 0;
106 for (
auto& entry : entries) {
107 entries_[i] = std::span{ bytes_ }.subspan(offset, entry.size());
109 offset += entry.size();
115 : bytes_(other.bytes_)
116 , entries_(other.entries_)
117 , hashes_(other.hashes_)
119 std::size_t offset = 0;
121 for (
auto& entry : entries_) {
122 entries_[i++] = std::span{ bytes_ }.subspan(offset, entry.size());
123 offset += entry.size();
128 : bytes_(std::move(other.bytes_))
129 , entries_(std::move(other.entries_))
130 , hashes_(std::move(other.hashes_))
132 other.entries_.clear();
134 std::size_t offset = 0;
136 for (
auto& entry : entries_) {
137 entries_[i++] = std::span{ bytes_ }.subspan(offset, entry.size());
138 offset += entry.size();
144 this->bytes_ = other.bytes_;
145 this->entries_ = other.entries_;
146 this->hashes_ = other.hashes_;
148 std::size_t offset = 0;
150 for (
auto& entry : entries_) {
151 entries_[i++] = std::span{ bytes_ }.subspan(offset, entry.size());
152 offset += entry.size();
160 this->bytes_ = std::move(other.bytes_);
161 this->entries_ = std::move(other.entries_);
162 this->hashes_ = std::move(other.hashes_);
164 std::size_t offset = 0;
166 for (
auto& entry : entries_) {
167 entries_[i++] = std::span{ bytes_ }.subspan(offset, entry.size());
168 offset += entry.size();
174 const std::vector<std::span<const uint8_t>>&
GetEntries() const noexcept {
return entries_; }
175 const auto&
GetHashes() const noexcept {
return hashes_; }
178 auto begin() noexcept {
return bytes_.begin(); }
179 auto end() noexcept {
return bytes_.end(); }
180 auto begin() const noexcept {
return bytes_.begin(); }
181 auto end() const noexcept {
return bytes_.end(); }
182 auto data() const noexcept {
return bytes_.data(); }
183 auto size() const noexcept {
return bytes_.size(); }
184 bool empty() const noexcept {
return bytes_.empty(); }
189 return lhs.bytes_ == rhs.bytes_;
196 return lhs.bytes_ < rhs.bytes_;
201 return lhs.bytes_ > rhs.bytes_;
210 if (this->hashes_.size() > other.hashes_.size()) {
214 for (
size_t i = 0; i < this->hashes_.size(); i++) {
215 if (this->hashes_[i] != other.hashes_[i]) {
225 const std::size_t prefix_size = std::min(this->hashes_.size(), other.hashes_.size());
226 for (
size_t i = 0; i < prefix_size; i++) {
227 if (this->hashes_[i] != other.hashes_[i]) {
236 std::vector<uint8_t> bytes_;
237 std::vector<std::span<const uint8_t>> entries_;
238 std::vector<std::size_t> hashes_;
243struct std::hash<
quicr::TrackNamespace>
267struct std::hash<
quicr::FullTrackName>
276 return (h << 2) >> 2;
289 TrackHash(
const uint64_t name_space,
const uint64_t name) noexcept
An N-tuple representation of a MOQ namespace.
Definition track_name.h:20
TrackNamespace(S &&... entries)
Constructs a namespace from a variadic number of string parameters.
Definition track_name.h:56
const std::vector< std::span< const uint8_t > > & GetEntries() const noexcept
Definition track_name.h:174
const auto & GetHashes() const noexcept
Definition track_name.h:175
auto data() const noexcept
Definition track_name.h:182
TrackNamespace(const std::vector< std::vector< uint8_t > > &entries)
Definition track_name.h:72
bool IsPrefixOf(const TrackNamespace &other) const noexcept
Definition track_name.h:208
TrackNamespace(const std::vector< std::string > &entries)
Definition track_name.h:93
friend bool operator==(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:187
auto size() const noexcept
Definition track_name.h:183
TrackNamespace & operator=(const TrackNamespace &other)
Definition track_name.h:142
bool empty() const noexcept
Definition track_name.h:184
friend bool operator>(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:199
friend bool operator!=(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:192
bool HasSamePrefix(const TrackNamespace &other) const noexcept
Definition track_name.h:223
friend bool operator<=(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:204
friend bool operator<(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:194
auto end() const noexcept
Definition track_name.h:181
friend bool operator>=(const TrackNamespace &lhs, const TrackNamespace &rhs) noexcept
Definition track_name.h:206
TrackNamespace(TrackNamespace &&other)
Definition track_name.h:127
TrackNamespace(B &&... entries)
Constructs a namespace from a variadic number of Bytes parameters.
Definition track_name.h:32
TrackNamespace & operator=(TrackNamespace &&other)
Definition track_name.h:158
auto begin() noexcept
Definition track_name.h:178
TrackNamespace(const TrackNamespace &other)
Definition track_name.h:114
auto begin() const noexcept
Definition track_name.h:180
auto end() noexcept
Definition track_name.h:179
Definition transport.h:28
uint64_t TrackNameHash
Definition track_name.h:251
uint64_t TrackFullNameHash
Definition track_name.h:252
uint64_t TrackNamespaceHash
Definition track_name.h:250
constexpr std::uint64_t hash(std::span< const std::uint8_t > bytes)
Hash a span of bytes to a 64bit number.
Definition hash.h:249
constexpr void hash_combine(std::uint64_t &seed, const std::uint64_t &value)
Combine (aka add) hash to existing hash.
Definition hash.h:263
Full track name struct.
Definition track_name.h:260
std::vector< uint8_t > name
Definition track_name.h:262
TrackNamespace name_space
Definition track_name.h:261
TrackHash & operator=(const TrackHash &)=default
uint64_t track_fullname_hash
Definition track_name.h:287
TrackNamespaceHash track_namespace_hash
Definition track_name.h:284
TrackHash(const TrackHash &)=default
TrackHash(const uint64_t name_space, const uint64_t name) noexcept
Definition track_name.h:289
TrackHash(const FullTrackName &ftn) noexcept
Definition track_name.h:300
TrackNameHash track_name_hash
Definition track_name.h:285
constexpr std::uint64_t operator()(const quicr::FullTrackName &ftn) const
Definition track_name.h:269
constexpr std::uint64_t operator()(const quicr::TrackNamespace &value) const
Definition track_name.h:245