summaryrefslogtreecommitdiff
path: root/src/uline.hh
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2025-09-17 00:48:46 +0200
committerJoel Klinghed <the_jk@spawned.biz>2025-09-17 00:48:46 +0200
commit2a9e59adb5db8630ab7bdbdeedac623e3397989b (patch)
tree44043f182f12ba9feb2c42ff2f4962ef1c452a96 /src/uline.hh
parentd091dc78154d1c6341251f1ed13bfe3b33f10773 (diff)
uline: Add unicode line reader
Diffstat (limited to 'src/uline.hh')
-rw-r--r--src/uline.hh72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/uline.hh b/src/uline.hh
new file mode 100644
index 0000000..a3bcef3
--- /dev/null
+++ b/src/uline.hh
@@ -0,0 +1,72 @@
+#ifndef ULINE_HH
+#define ULINE_HH
+
+#include "line.hh" // IWYU pragma: export
+#include "uio.hh" // IWYU pragma: export
+
+#include <cstddef>
+#include <expected>
+#include <memory>
+#include <string_view>
+
+namespace u8 {
+
+namespace line {
+
+class Reader {
+ public:
+ virtual ~Reader() = default;
+
+ // Returned view is only valid until next call to read.
+ [[nodiscard]]
+ virtual std::expected<std::string_view, ::line::ReadError> read() = 0;
+
+ // Starts at zero. Returns next line.
+ // So, before first read it is zero, after first read it is one.
+ [[nodiscard]] virtual uint64_t number() const = 0;
+
+ protected:
+ Reader() = default;
+
+ Reader(Reader const&) = delete;
+ Reader& operator=(Reader const&) = delete;
+};
+
+[[nodiscard]] std::unique_ptr<Reader> open(std::unique_ptr<u8::Reader> reader,
+ size_t max_len = 8192);
+
+} // namespace line
+
+} // namespace u8
+
+namespace u16 {
+
+namespace line {
+
+class Reader {
+ public:
+ virtual ~Reader() = default;
+
+ // Returned view is only valid until next call to read.
+ [[nodiscard]]
+ virtual std::expected<std::u16string_view, ::line::ReadError> read() = 0;
+
+ // Starts at zero. Returns next line.
+ // So, before first read it is zero, after first read it is one.
+ [[nodiscard]] virtual uint64_t number() const = 0;
+
+ protected:
+ Reader() = default;
+
+ Reader(Reader const&) = delete;
+ Reader& operator=(Reader const&) = delete;
+};
+
+[[nodiscard]] std::unique_ptr<Reader> open(std::unique_ptr<u16::Reader> reader,
+ size_t max_len = 8192);
+
+} // namespace line
+
+} // namespace u16
+
+#endif // ULINE_HH