#ifndef IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_ // NOLINT #define IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_ // NOLINT #include "image_io/base/data_destination.h" #include "image_io/base/data_range.h" namespace photos_editing_formats { namespace image_io { /// A DataDestination that tracks the transfer_range values as they are passed /// from the caller of the Transfer() function to next DataDestination. /// Instances of this class can be used to track the number of bytes transferred /// and/or to ensure that multiple calls to the Transfer() function are called /// with transfer_range values that join in a end-to-begin fashion. This data /// can be used to make sure that the data transferred meets the expectations of /// the client. class DataRangeTrackingDestination : public DataDestination { public: /// @param destination The DataDestination that is next in the chain, or /// nullptr if there is no destination. explicit DataRangeTrackingDestination(DataDestination* destination) : destination_(destination), bytes_transferred_(0), has_disjoint_transfer_ranges_(false) {} /// @return The number of bytes written to the data destination. Bytes are /// considered "written" even if the next destination is a nullptr. size_t GetBytesTransferred() const override { return bytes_transferred_; } /// @return The tracked data range (see the class comment for how this value /// is computed). const DataRange& GetTrackedDataRange() const { return tracked_data_range_; } /// @return Whether disjoint transfer data ranges were detected by the /// Transfer() function. Disjoint transfer ranges occur when two calls /// to the Transfer() function occur where first_range.GetEnd() is not //// equal to the second_range.GetBegin(). bool HasDisjointTransferRanges() const { return has_disjoint_transfer_ranges_; } void StartTransfer() override; TransferStatus Transfer(const DataRange& transfer_range, const DataSegment& data_segment) override; void FinishTransfer() override; private: DataDestination* destination_; DataRange tracked_data_range_; size_t bytes_transferred_; bool has_disjoint_transfer_ranges_; }; } // namespace image_io } // namespace photos_editing_formats #endif // IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_ // NOLINT