77#define LIBCYPHAL_TRANSPORT_SCATTERED_BUFFER_HPP_INCLUDED
88
99#include " libcyphal/config.hpp"
10+ #include " types.hpp"
1011
1112#include < cetl/pf17/cetlpf.hpp>
1213#include < cetl/rtti.hpp>
@@ -33,6 +34,26 @@ class ScatteredBuffer final
3334 // /
3435 static constexpr std::size_t StorageVariantFootprint = config::Transport::ScatteredBuffer_StorageVariantFootprint();
3536
37+ // / @brief Defines interface for observing internal fragments of the scattered buffer.
38+ // /
39+ class IFragmentsObserver
40+ {
41+ public:
42+ IFragmentsObserver (const IFragmentsObserver&) = delete ;
43+ IFragmentsObserver& operator =(const IFragmentsObserver&) = delete ;
44+ IFragmentsObserver& operator =(IFragmentsObserver&&) noexcept = delete ;
45+ IFragmentsObserver (IFragmentsObserver&&) noexcept = delete ;
46+
47+ // / @brief Notifies the observer about the next fragment of the scattered buffer.
48+ // /
49+ virtual void onNext (const PayloadFragment fragment) = 0;
50+
51+ protected:
52+ IFragmentsObserver () = default ;
53+ ~IFragmentsObserver () = default ;
54+
55+ }; // IFragmentsObserver
56+
3657 // / @brief Defines storage interface for the scattered buffer.
3758 // /
3859 // / @see ScatteredBuffer::ScatteredBuffer(AnyStorage&& any_storage)
@@ -72,6 +93,12 @@ class ScatteredBuffer final
7293 cetl::byte* const destination,
7394 const std::size_t length_bytes) const = 0;
7495
96+ // / @brief Reports the internal fragments of the storage to the specified observer.
97+ // /
98+ // / @param observer The observer will be called (by `onNext` method) for each fragment of the storage.
99+ // /
100+ virtual void observeFragments (IFragmentsObserver& observer) const = 0;
101+
75102 // MARK: RTTI
76103
77104 static constexpr cetl::type_id _get_type_id_ () noexcept
@@ -201,6 +228,18 @@ class ScatteredBuffer final
201228 return storage_->copy (offset_bytes, static_cast <cetl::byte*>(destination), length_bytes);
202229 }
203230
231+ // / @brief Reports the internal fragments of the buffer to the specified observer.
232+ // /
233+ // / @param observer The observer will be called (by `onNext` method) for each fragment of the buffer.
234+ // /
235+ void observeFragments (IFragmentsObserver& observer) const
236+ {
237+ if (const auto * const storage = storage_)
238+ {
239+ storage->observeFragments (observer);
240+ }
241+ }
242+
204243private:
205244 cetl::unbounded_variant<StorageVariantFootprint, false , true > storage_variant_;
206245 const IStorage* storage_;
0 commit comments