ActiveLib
Loading...
Searching...
No Matches
BufferIn.h
1
6#ifndef ACTIVE_UTILITY_BUFFER_IN
7#define ACTIVE_UTILITY_BUFFER_IN
8
9#include "Active/File/Interface/IOBase.h"
10#include "Active/Utility/Memory.h"
11#include "Active/Utility/String.h"
12#include "Active/Utility/TextEncoding.h"
13
14namespace active::file {
15
16 class File;
17
18}
19
20namespace active::utility {
21
22 class Memory;
23
27 class BufferIn: public file::IOBase {
28 public:
29
30 using enum TextEncoding;
31
32 // MARK: - Constructors
33
39 BufferIn(const file::File& sourceFile, DataFormat::Option format = DataFormat{});
45 BufferIn(const Memory& sourceMem, DataFormat::Option format = DataFormat{});
51 BufferIn(const String& sourceString, DataFormat::Option format = DataFormat{});
56 BufferIn(BufferIn&& source)noexcept;
57
59 BufferIn(const BufferIn&) = delete;
60
61 // MARK: - Operators
62
68 BufferIn& operator= (BufferIn&& source) noexcept;
69 //No assignment
70 BufferIn& operator= (const BufferIn&) = delete;
75 operator bool () const { return !fail(); }
81 const BufferIn& operator>>(String& str) const { str = readWord(); return *this; }
87 const BufferIn& operator>>(int16_t& val) const { return getValue(val); }
93 const BufferIn& operator>>(int32_t& val) const { return getValue(val); }
99 const BufferIn& operator>>(uint32_t& val) const { return getValue(val); }
105 const BufferIn& operator>>(int64_t& val) const { return getValue(val); }
111 const BufferIn& operator>>(uint64_t& val) const { return getValue(val); }
117 const BufferIn& operator>>(double& val) const;
118
119 // MARK: - Functions (const)
120
125 const char* data() const { return !good() ? nullptr : m_buffer; }
130 Memory::size_type dataSize() const { return (!good() || (m_readPos >= m_bufferLen)) ? 0 : m_bufferLen - m_readPos; }
140 Memory::size_type getLastRow() const { return m_lastRow; }
145 Memory::size_type getLastColumn() const { return m_lastColumn; }
155 TextEncoding textEncoding() const { return m_format.encoding; }
161 void forEach(const String::Function& func, String* pool = nullptr) const;
169 bool findIf(const String::Filter& filter, String* pool = nullptr, bool isFoundSkipped = false) const;
177 bool find(char32_t toFind, String* pool = nullptr, bool isFoundSkipped = false) const;
185 bool find(const String& toFind, String* pool = nullptr, bool isFoundSkipped = false) const
186 { return seek(toFind, pool, true, true, true, false, isFoundSkipped, false); }
198 bool findFirstOf(const String& toFind, String* pool = nullptr, bool isContiguousMatch = false, bool isRepeatMatch = false,
199 bool isFoundSkipped = false, bool isFoundPooled = false, std::optional<char32_t> escapeChar = std::nullopt) const
200 { return seek(toFind, pool, isContiguousMatch, false, false, isRepeatMatch, isFoundSkipped, isFoundPooled, escapeChar); }
208 bool findFirstNotOf(const String& toFind, String* pool = nullptr, std::optional<char32_t> escapeChar = std::nullopt) const
209 { return seekNot(toFind, pool); }
215 const BufferIn& get(unsigned char& dest) const;
222 Memory::size_type getEncodedChar(String& encodedChar, bool isConsumed = true) const;
228 std::pair<char32_t, String::size_type> getEncodedChar(bool isConsumed = true) const;
234 const BufferIn& get(String& dest) const;
241 const BufferIn& read(char* dest, Memory::size_type& howMany) const;
247 String readWord(const String& division = String::allWhiteSpace) const;
254 std::vector<String> readWords(Memory::sizeOption howMany = std::nullopt, const String& division = String::allWhiteSpace) const;
260 template<class T>
261 const BufferIn& getValue(T& val) const {
262 if (std::optional<T> temp{ readWord() }; temp)
263 val = *temp;
264 else {
265 setState(std::ios_base::failbit);
266 val = T();
267 }
268 return *this;
269 }
276 const BufferIn& getString(String& dest, String::sizeOption howMany = std::nullopt) const;
283 const BufferIn& getLine(String& line, bool keepStop = true) const;
289 const BufferIn& skip(Memory::size_type howMany) const;
295 const BufferIn& rewind(Memory::size_type howMany) const;
300 void setPosition(Memory::size_type pos) const;
301
302 // MARK: - Functions (mutating)
303
308 void swap(BufferIn& other);
313 void setFormat(DataFormat format) { m_format = format; }
318 void setSourceEncoding(TextEncoding encoding) { m_format.encoding = encoding; }
324 void setSource(const file::File& sourceFile, DataFormat::Option format = DataFormat{});
330 void setSource(const Memory& sourceMem, DataFormat::Option format = DataFormat{});
336 void setSource(const String& sourceString, DataFormat::Option format = DataFormat{});
337
338 private:
343 void bumpReadPos(Memory::size_type howMany) const;
348 bool checkEndOfFile() const;
354 Memory::size_type bufferMin(Memory::size_type minLength) const;
359 bool refillBuffer() const;
373 bool seek(const String& toFind, String* pool, bool isAllMatched, bool isContiguousMatch, bool isOrderedMatch,
374 bool isRepeatMatch, bool isFoundSkipped, bool isFoundPooled, std::optional<char32_t> escapeChar = std::nullopt) const;
381 bool seekNot(const String& toFind, String* pool, std::optional<char32_t> escapeChar = std::nullopt) const;
387 void updatePosition(unsigned char incoming, uint8_t size = 1) const;
392 Memory::size_type getCapacity() const;
397 Memory::size_type getSupplyCount() const { return (m_bufferLen - m_readPos) + m_remaining; }
402 DataFormat discoverFormat();
409 void initialise(char* pointerSrc, const file::File* fileSrc, Memory::size_type dataLen);
410
412 char* m_buffer = nullptr;
414 const file::File* m_file = nullptr;
416 std::unique_ptr<Memory> m_fileCache;
418 DataFormat m_format;
420 mutable Memory::size_type m_readPos = 0;
422 mutable Memory::size_type m_bufferLen = 0;
424 mutable Memory::size_type m_remaining = 0;
426 mutable Memory::size_type m_lastRow = 0;
428 mutable Memory::size_type m_lastColumn = 0;
430 mutable bool m_foundCR = false;
431 };
432
433 void swap(BufferIn& v1, BufferIn& v2);
434}
435
436#endif //ACTIVE_UTILITY_BUFFER_IN
Class to represent a file.
Definition File.h:21
Definition IOBase.h:13
virtual bool fail() const noexcept
Definition IOBase.h:66
virtual void setState(flag_type f)
Definition IOBase.h:89
virtual bool good() const noexcept
Definition IOBase.h:56
Definition BufferIn.h:27
TextEncoding textEncoding() const
Definition BufferIn.h:155
const BufferIn & getLine(String &line, bool keepStop=true) const
Definition BufferIn.cpp:426
const char * data() const
Definition BufferIn.h:125
const BufferIn & skip(Memory::size_type howMany) const
Definition BufferIn.cpp:439
const BufferIn & rewind(Memory::size_type howMany) const
Definition BufferIn.cpp:457
Memory::size_type getLastColumn() const
Definition BufferIn.h:145
void setSource(const file::File &sourceFile, DataFormat::Option format=DataFormat{})
Definition BufferIn.cpp:534
const BufferIn & getString(String &dest, String::sizeOption howMany=std::nullopt) const
Definition BufferIn.cpp:406
const BufferIn & getValue(T &val) const
Definition BufferIn.h:261
bool findFirstNotOf(const String &toFind, String *pool=nullptr, std::optional< char32_t > escapeChar=std::nullopt) const
Definition BufferIn.h:208
const BufferIn & read(char *dest, Memory::size_type &howMany) const
Definition BufferIn.cpp:343
BufferIn(const file::File &sourceFile, DataFormat::Option format=DataFormat{})
Definition BufferIn.cpp:55
bool find(char32_t toFind, String *pool=nullptr, bool isFoundSkipped=false) const
Definition BufferIn.cpp:246
const BufferIn & operator>>(String &str) const
Definition BufferIn.h:81
Memory::size_type dataSize() const
Definition BufferIn.h:130
Memory::size_type getEncodedChar(String &encodedChar, bool isConsumed=true) const
Definition BufferIn.cpp:276
Memory::size_type sourceSize() const
Definition BufferIn.cpp:150
const BufferIn & operator>>(uint64_t &val) const
Definition BufferIn.h:111
void setFormat(DataFormat format)
Definition BufferIn.h:313
bool findFirstOf(const String &toFind, String *pool=nullptr, bool isContiguousMatch=false, bool isRepeatMatch=false, bool isFoundSkipped=false, bool isFoundPooled=false, std::optional< char32_t > escapeChar=std::nullopt) const
Definition BufferIn.h:198
void setPosition(Memory::size_type pos) const
Definition BufferIn.cpp:493
Memory::size_type getLastRow() const
Definition BufferIn.h:140
String readWord(const String &division=String::allWhiteSpace) const
Definition BufferIn.cpp:369
std::vector< String > readWords(Memory::sizeOption howMany=std::nullopt, const String &division=String::allWhiteSpace) const
Definition BufferIn.cpp:385
bool findIf(const String::Filter &filter, String *pool=nullptr, bool isFoundSkipped=false) const
Definition BufferIn.cpp:211
const BufferIn & operator>>(uint32_t &val) const
Definition BufferIn.h:99
const BufferIn & operator>>(int32_t &val) const
Definition BufferIn.h:93
bool find(const String &toFind, String *pool=nullptr, bool isFoundSkipped=false) const
Definition BufferIn.h:185
BufferIn & operator=(BufferIn &&source) noexcept
Definition BufferIn.cpp:127
BufferIn(const BufferIn &)=delete
No copy constructor.
const BufferIn & operator>>(int16_t &val) const
Definition BufferIn.h:87
const BufferIn & operator>>(int64_t &val) const
Definition BufferIn.h:105
void setSourceEncoding(TextEncoding encoding)
Definition BufferIn.h:318
Memory::size_type getPosition() const
Definition BufferIn.cpp:167
void swap(BufferIn &other)
Definition BufferIn.cpp:522
const BufferIn & get(unsigned char &dest) const
Definition BufferIn.cpp:259
void forEach(const String::Function &func, String *pool=nullptr) const
Definition BufferIn.cpp:184
Class representing (and optionally allocating) memory with a specified location and size.
Definition Memory.h:18
std::optional< size_type > sizeOption
Optional memory size/position.
Definition Memory.h:28
std::size_t size_type
Memory size/position type.
Definition Memory.h:26
A Unicode-aware string class.
Definition String.h:51
static const String allWhiteSpace
All white space characters.
Definition String.h:80
std::function< bool(char32_t)> Filter
Unary predicate for filtering strings.
Definition String.h:69
std::function< std::optional< char32_t >(char32_t)> Function
Unary functions for processing string characters.
Definition String.h:71
std::optional< size_type > sizeOption
Optional size type (used to indicate an unspecified or non-existant position)
Definition String.h:67
Definition Directory.h:12
Definition Base64Transport.h:11
Definition DataFormat.h:20
TextEncoding encoding
The text encoding.
Definition DataFormat.h:61