18 #include <core/manifest_format.h>
22 using transport::core::NextSegmentCalculationStrategy;
26 static constexpr uint32_t INVALID_SUFFIX =
27 std::numeric_limits<uint32_t>::max();
30 : suffix_stragegy_(strategy),
32 final_suffix_(INVALID_SUFFIX) {}
36 virtual uint32_t checkNextSuffix() = 0;
38 virtual uint32_t getNextSuffix() = 0;
40 virtual uint32_t getFinalSuffix() {
return final_suffix_; }
42 virtual void setFinalSuffix(std::uint32_t final_suffix) {
43 if (final_suffix != INVALID_SUFFIX) {
44 final_suffix_ = final_suffix;
48 virtual uint32_t checkNextManifestSuffix() = 0;
50 virtual uint32_t getNextManifestSuffix() = 0;
52 virtual uint32_t checkNextContentSuffix() = 0;
54 virtual uint32_t getNextContentSuffix() = 0;
56 virtual void reset(uint32_t offset = 0) = 0;
58 virtual uint32_t getManifestCapacity() = 0;
60 virtual void setManifestCapacity(uint32_t capacity) = 0;
62 virtual uint32_t getTotalCount() {
return total_count_; };
64 NextSegmentCalculationStrategy getSuffixStrategy() {
65 return suffix_stragegy_;
69 inline void incrementTotalCount() { total_count_++; };
72 NextSegmentCalculationStrategy suffix_stragegy_;
73 std::uint32_t total_count_;
74 std::uint32_t final_suffix_;
81 next_suffix_(start_offset) {}
83 TRANSPORT_ALWAYS_INLINE std::uint32_t checkNextSuffix()
override {
87 TRANSPORT_ALWAYS_INLINE std::uint32_t getNextSuffix()
override {
88 incrementTotalCount();
89 return next_suffix_++;
92 TRANSPORT_ALWAYS_INLINE std::uint32_t checkNextContentSuffix()
override {
93 return checkNextSuffix();
96 TRANSPORT_ALWAYS_INLINE std::uint32_t getNextContentSuffix()
override {
97 return getNextSuffix();
100 TRANSPORT_ALWAYS_INLINE std::uint32_t checkNextManifestSuffix()
override {
101 return checkNextSuffix();
104 TRANSPORT_ALWAYS_INLINE std::uint32_t getNextManifestSuffix()
override {
105 return getNextSuffix();
108 uint32_t getManifestCapacity()
override {
110 "No manifest capacity in IncrementalSuffixStrategy.");
113 void setManifestCapacity(uint32_t capacity)
override {
115 "No manifest capacity in IncrementalSuffixStrategy.");
118 void reset(std::uint32_t offset = 0)
override { next_suffix_ = offset; }
121 std::uint32_t next_suffix_;
127 std::uint32_t manifest_capacity)
129 next_suffix_(start_offset),
130 segments_in_manifest_(manifest_capacity),
131 current_manifest_iteration_(0) {}
133 TRANSPORT_ALWAYS_INLINE std::uint32_t checkNextSuffix()
override {
137 TRANSPORT_ALWAYS_INLINE std::uint32_t getNextSuffix()
override {
138 incrementTotalCount();
139 return next_suffix_++;
142 TRANSPORT_ALWAYS_INLINE std::uint32_t checkNextContentSuffix()
override {
143 return next_suffix_ % segments_in_manifest_ == 0 ? next_suffix_
144 : (next_suffix_ + 1);
147 TRANSPORT_ALWAYS_INLINE std::uint32_t getNextContentSuffix()
override {
148 incrementTotalCount();
149 return next_suffix_ % segments_in_manifest_ == 0 ? next_suffix_++
153 TRANSPORT_ALWAYS_INLINE std::uint32_t checkNextManifestSuffix()
override {
154 return (current_manifest_iteration_ + 1) * (segments_in_manifest_ + 1);
157 TRANSPORT_ALWAYS_INLINE std::uint32_t getNextManifestSuffix()
override {
158 incrementTotalCount();
159 return (current_manifest_iteration_++) * (segments_in_manifest_ + 1);
162 TRANSPORT_ALWAYS_INLINE uint32_t getManifestCapacity()
override {
163 return segments_in_manifest_;
166 TRANSPORT_ALWAYS_INLINE
void setManifestCapacity(uint32_t capacity)
override {
167 segments_in_manifest_ = capacity;
170 void reset(std::uint32_t offset = 0)
override { next_suffix_ = offset; }
173 std::uint32_t next_suffix_;
174 std::uint32_t segments_in_manifest_;
175 std::uint32_t current_manifest_iteration_;
180 static std::unique_ptr<SuffixStrategy> getSuffixStrategy(
181 NextSegmentCalculationStrategy strategy, uint32_t start_offset,
182 uint32_t manifest_capacity = 0) {
184 case NextSegmentCalculationStrategy::INCREMENTAL:
185 return std::make_unique<IncrementalSuffixStrategy>(start_offset);
186 case NextSegmentCalculationStrategy::MANIFEST_CAPACITY_BASED:
187 return std::make_unique<CapacityBasedSuffixStrategy>(start_offset,
191 "No valid NextSegmentCalculationStrategy specified.");