Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarBuffer.hpp
blob: 4870b531ccf3e45e678276ed02469236deedea46 (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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#pragma once

#include "StarIODevice.hpp"
#include "StarString.hpp"

namespace Star {

STAR_CLASS(Buffer);
STAR_CLASS(ExternalBuffer);

// Wraps a ByteArray to an IODevice
class Buffer : public IODevice {
public:
  // Constructs buffer open ReadWrite
  Buffer();
  Buffer(size_t initialSize);
  Buffer(ByteArray b);
  Buffer(Buffer const& buffer);
  Buffer(Buffer&& buffer);

  StreamOffset pos() override;
  void seek(StreamOffset pos, IOSeek mode = IOSeek::Absolute) override;
  void resize(StreamOffset size) override;
  bool atEnd() override;

  size_t read(char* data, size_t len) override;
  size_t write(char const* data, size_t len) override;

  size_t readAbsolute(StreamOffset readPosition, char* data, size_t len) override;
  size_t writeAbsolute(StreamOffset writePosition, char const* data, size_t len) override;

  void open(IOMode mode) override;

  String deviceName() const override;

  StreamOffset size() override;
  
  IODevicePtr clone() override;

  ByteArray& data();
  ByteArray const& data() const;

  // If this class holds the underlying data, then this method is cheap, and
  // will move the data out of this class into the returned array, otherwise,
  // this will incur a copy.  Afterwards, this Buffer will be left empty.
  ByteArray takeData();

  // Returns a pointer to the beginning of the Buffer.
  char* ptr();
  char const* ptr() const;

  // Same thing as size(), just size_t type (since this is in-memory)
  size_t dataSize() const;
  void reserve(size_t size);

  // Clears buffer, moves position to 0.
  void clear();
  bool empty() const;

  // Reset buffer with new contents, moves position to 0.
  void reset(size_t newSize);
  void reset(ByteArray b);

  Buffer& operator=(Buffer const& buffer);
  Buffer& operator=(Buffer&& buffer);

private:
  size_t doRead(size_t pos, char* data, size_t len);
  size_t doWrite(size_t pos, char const* data, size_t len);

  size_t m_pos;
  ByteArray m_bytes;
};

// Wraps an externally held sequence of bytes to a read-only IODevice
class ExternalBuffer : public IODevice {
public:
  // Constructs an empty ReadOnly ExternalBuffer.
  ExternalBuffer();
  // Constructs a ReadOnly ExternalBuffer pointing to the given external data, which
  // must be valid for the lifetime of the ExternalBuffer.
  ExternalBuffer(char const* externalData, size_t len);

  ExternalBuffer(ExternalBuffer const& buffer) = default;
  ExternalBuffer& operator=(ExternalBuffer const& buffer) = default;

  StreamOffset pos() override;
  void seek(StreamOffset pos, IOSeek mode = IOSeek::Absolute) override;
  bool atEnd() override;

  size_t read(char* data, size_t len) override;
  size_t write(char const* data, size_t len) override;

  size_t readAbsolute(StreamOffset readPosition, char* data, size_t len) override;
  size_t writeAbsolute(StreamOffset writePosition, char const* data, size_t len) override;

  String deviceName() const override;

  StreamOffset size() override;
  
  IODevicePtr clone() override;

  // Returns a pointer to the beginning of the Buffer.
  char const* ptr() const;

  // Same thing as size(), just size_t type (since this is in-memory)
  size_t dataSize() const;

  // Clears buffer, moves position to 0.
  bool empty() const;

  operator bool() const;

  // Reset buffer with new contents, moves position to 0.
  void reset(char const* externalData, size_t len);

private:
  size_t doRead(size_t pos, char* data, size_t len);

  size_t m_pos;
  char const* m_bytes;
  size_t m_size;
};

}