aboutsummaryrefslogtreecommitdiff
path: root/src/common/io/ProxyStream.cpp
blob: df8e7dccc0a638ef801a4c18cd0de64a0344f8b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "cru/common/io/ProxyStream.h"
#include "cru/common/io/Stream.h"

namespace cru::io {
ProxyStream::ProxyStream(ProxyStreamHandlers handlers)
    : closed_(false), handlers_(std::move(handlers)) {}

ProxyStream::~ProxyStream() { DoClose(); }

bool ProxyStream::CanSeek() {
  CheckClosed();
  return static_cast<bool>(handlers_.seek);
}

Index ProxyStream::Seek(Index offset, SeekOrigin origin) {
  CheckClosed();
  StreamOperationNotSupportedException::CheckSeek(CanSeek());
  return handlers_.seek(offset, origin);
}

bool ProxyStream::CanRead() {
  CheckClosed();
  return static_cast<bool>(handlers_.read);
}

Index ProxyStream::Read(std::byte* buffer, Index offset, Index size) {
  CheckClosed();
  StreamOperationNotSupportedException::CheckRead(CanRead());
  return handlers_.read(buffer, offset, size);
}

bool ProxyStream::CanWrite() {
  CheckClosed();
  return static_cast<bool>(handlers_.write);
}

Index ProxyStream::Write(const std::byte* buffer, Index offset, Index size) {
  CheckClosed();
  StreamOperationNotSupportedException::CheckWrite(CanWrite());
  return handlers_.write(buffer, offset, size);
}

void ProxyStream::Flush() {
  CheckClosed();
  if (handlers_.flush) {
    handlers_.flush();
  }
}

void ProxyStream::Close() { DoClose(); }

void ProxyStream::CheckClosed() {
  StreamAlreadyClosedException::Check(closed_);
}

void ProxyStream::DoClose() {
  if (!closed_) {
    if (handlers_.close) {
      handlers_.close();
    }
    closed_ = true;
  }
}
}  // namespace cru::io