#ifndef IMAGE_IO_BASE_DATA_LINE_MAP_BUILDER_DESTINATION_H_ // NOLINT #define IMAGE_IO_BASE_DATA_LINE_MAP_BUILDER_DESTINATION_H_ // NOLINT #include "image_io/base/data_destination.h" #include "image_io/base/data_line_map.h" namespace photos_editing_formats { namespace image_io { /// A class to build a data line map of the string implied by the transfer /// range of a data segment before passing the transfer off to an optional /// next data destination. class DataLineMapBuilderDestination : public DataDestination { public: /// @param data_line_map The data line map to build. /// @param next_destination An optional next transfer data destination DataLineMapBuilderDestination(DataLineMap* data_line_map, DataDestination* next_destination) : data_line_map_(data_line_map), next_destination_(next_destination), bytes_transferred_(0) {} void StartTransfer() override { if (next_destination_ != nullptr) { next_destination_->StartTransfer(); } } void FinishTransfer() override { if (next_destination_ != nullptr) { next_destination_->FinishTransfer(); } } TransferStatus Transfer(const DataRange& transfer_range, const DataSegment& data_segment) override { bytes_transferred_ += transfer_range.GetLength(); data_line_map_->FindDataLines(transfer_range, data_segment); return next_destination_ != nullptr ? next_destination_->Transfer(transfer_range, data_segment) : kTransferOk; } size_t GetBytesTransferred() const override { return bytes_transferred_; } private: DataLineMap* data_line_map_; DataDestination* next_destination_; size_t bytes_transferred_; }; } // namespace image_io } // namespace photos_editing_formats #endif // IMAGE_IO_BASE_DATA_LINE_MAP_BUILDER_DESTINATION_H_ // NOLINT