bytestreambuf.h
1 #pragma once
2 
3 #include "stormancer/BuildConfig.h"
4 
5 #include "stormancer/StormancerTypes.h"
6 #include <streambuf>
7 #include <locale>
8 
9 namespace std
10 {
11  template<>
12  class ctype<Stormancer::byte> : public ctype<char>
13  {
14  public:
15 
16  explicit ctype(size_t refs)
17  : ctype<char>(0, false, refs)
18  {
19  }
20 
21  explicit ctype(const mask* table = 0, bool del = false, size_t refs = 0)
22  : ctype<char>(table, del, refs)
23  {
24  }
25  };
26 }
27 
28 namespace Stormancer
29 {
30  class bytestreambuf : public std::basic_streambuf<byte>
31  {
32  public:
33 
34 #pragma region public_methods
35 
36  enum
37  {
38  Read = 1,
39  Write = 2,
40  Dynamic = 4,
41  Allocated = 8
42  };
43  typedef int Mode;
44 
45  bytestreambuf();
46 
47  bytestreambuf(byte* dataPtr, std::streamsize dataSize, bool isDynamic = false);
48 
49  ~bytestreambuf();
50 
51  byte* startReadPtr();
52 
53  byte* currentReadPtr();
54 
55  byte* endReadPtr();
56 
57  byte* startWritePtr();
58 
59  byte* currentWritePtr();
60 
61  byte* endWritePtr();
62 
63  std::streamsize size();
64 
65  std::streamsize currentReadPosition();
66 
67  std::streamsize currentWritePosition();
68 
69  void dynamic(bool dyn);
70 
71 #pragma endregion
72 
73  protected:
74 
75 #pragma region protected_methods
76 
77  std::basic_streambuf<byte>* setbuf(byte* s, std::streamsize size) override;
78 
79  pos_type seekoff(off_type off, std::ios_base::seekdir way, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out) override;
80 
81  pos_type seekpos(pos_type pos, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out) override;
82 
83  std::streamsize showmanyc() override;
84 
85  std::streamsize xsgetn(byte* s, std::streamsize n) override;
86 
87  int_type underflow() override;
88 
89  int_type uflow() override;
90 
91  int_type pbackfail(int_type c = traits_type::eof()) override;
92 
93  std::streamsize xsputn(const char_type* s, std::streamsize n) override;
94 
95  int_type overflow(int_type c = traits_type::eof()) override;
96 
97  void tidy();
98 
99  void reset();
100 
101  void init(std::streamsize size = 0);
102 
103  void grow(std::streamsize minSize);
104 
105  inline bool setgIfValid(byte* first, byte* next, byte* last);
106 
107  inline bool setpIfValid(byte* first, byte* next, byte* last);
108 
109  void updateReadAfterWrite();
110 
111 #pragma endregion
112 
113  private:
114 
115 #pragma region private_members
116 
117  Mode _mode = 0;
118 
119 #pragma endregion
120  };
121 }
Definition: bytestreambuf.h:30