#include "buffered_reader.h"

#include <utility>
#include <algorithm>
#include <string>

PackageStream::PackageStream(std::string source, int32_t package_len) :
        source_(std::move(source)), package_len_(package_len) {
}

int32_t PackageStream::PackageLen() const {
    return this->package_len_;
}

int32_t PackageStream::ReadPackage(char *output_package) {
    memcpy(output_package, this->source.c_str(), this->PackageLen());
    int32_t real_size = std::min(static_cast<int>(this->source.size()),
                            this->PackageLen());
    this->source.erase(this->source.begin(),
                       this->source.begin() + real_size);
    return real_size;
}

class BufferedReader {
 public:
    explicit BufferedReader(PackageStream *stream) : stream(stream) {
    }

    int32_t Read(char *output_buffer, int32_t buffer_len) {
        this->stream->package_len_ = buffer_len;
        return this->stream->ReadPackage(output_buffer);
    }

 private:
    PackageStream *stream;
};