aboutsummaryrefslogtreecommitdiff
path: root/include/openvic-dataloader/NodeLocation.hpp
diff options
context:
space:
mode:
author Spartan322 <Megacake1234@gmail.com>2024-05-09 16:06:02 +0200
committer Spartan322 <Megacake1234@gmail.com>2024-06-18 01:31:12 +0200
commitb0c3ba3f91926b0c95625bdbf4aab69269130b13 (patch)
treef15ebc47d6bf370031af28e4bb4814ae30ef46e1 /include/openvic-dataloader/NodeLocation.hpp
parent7b521d6023113372cf6b02e562828273c4040f0e (diff)
Add runtime encoding detection and conversionfix/char-detection
Win-1251/1252 detection is a reduced C++ version of https://github.com/hsivonen/chardetng Add manually-specified encoding fallback Add default system encoding fallback Add error recovery to v2script Add unknown encoding detection warning Remove csv::Parser templating Fix lua files dropping data Update lexy to foonathan/lexy@1e5d99fa3826b1c3c8628d3a11117fb4fb4cc0d0 Remove exclusive reliance on lexy::default_encoding for v2script Move internal concepts to src/openvic-detail/InternalConcepts.hpp Move contents of DetectUtf8.hpp to src/detail/Detect.hpp Move openvic-dataloader/AbstractSyntaxTree.hpp to src Move DiagnosticLogger.hpp to src Move File.hpp to src Move openvic-dataloader/detail/utlity files to openvic-dataloader/detail Add ovdl::utility::type_concat Add ovdl::utility::type_prepend Add ovdl::utility::is_instance_of Overhaul parse error messages
Diffstat (limited to 'include/openvic-dataloader/NodeLocation.hpp')
-rw-r--r--include/openvic-dataloader/NodeLocation.hpp68
1 files changed, 54 insertions, 14 deletions
diff --git a/include/openvic-dataloader/NodeLocation.hpp b/include/openvic-dataloader/NodeLocation.hpp
index 117560b..ced79e6 100644
--- a/include/openvic-dataloader/NodeLocation.hpp
+++ b/include/openvic-dataloader/NodeLocation.hpp
@@ -3,28 +3,68 @@
#include <cstdint>
namespace ovdl {
- struct NodeLocation {
- const char* _begin = nullptr;
- const char* _end = nullptr;
+ template<typename CharT>
+ struct BasicNodeLocation {
+ using char_type = CharT;
- NodeLocation();
- NodeLocation(const char* pos);
- NodeLocation(const char* begin, const char* end);
+ const char_type* _begin = nullptr;
+ const char_type* _end = nullptr;
- NodeLocation(const NodeLocation&) noexcept;
- NodeLocation& operator=(const NodeLocation&);
+ BasicNodeLocation() = default;
+ BasicNodeLocation(const char_type* pos) : _begin(pos),
+ _end(pos) {}
+ BasicNodeLocation(const char_type* begin, const char_type* end) : _begin(begin),
+ _end(end) {}
- NodeLocation(NodeLocation&&);
- NodeLocation& operator=(NodeLocation&&);
+ BasicNodeLocation(const BasicNodeLocation&) noexcept = default;
+ BasicNodeLocation& operator=(const BasicNodeLocation&) = default;
- const char* begin() const;
- const char* end() const;
+ BasicNodeLocation(BasicNodeLocation&&) = default;
+ BasicNodeLocation& operator=(BasicNodeLocation&&) = default;
- bool is_synthesized() const;
+ template<typename OtherCharT>
+ void set_from(const BasicNodeLocation<OtherCharT>& other) {
+ if constexpr (sizeof(CharT) <= sizeof(OtherCharT)) {
+ _begin = reinterpret_cast<const CharT*>(other.begin());
+ if (other.begin() == other.end())
+ _end = _begin;
+ else
+ _end = reinterpret_cast<const CharT*>(other.end()) + (sizeof(OtherCharT) - sizeof(CharT));
+ } else {
+ _begin = reinterpret_cast<const CharT*>(other.begin());
+ if (other.end() - other.begin() <= 0) {
+ _end = reinterpret_cast<const CharT*>(other.begin());
+ } else {
+ _end = reinterpret_cast<const CharT*>(other.end() - (sizeof(CharT) - sizeof(OtherCharT)));
+ }
+ }
+ }
- static NodeLocation make_from(const char* begin, const char* end);
+ template<typename OtherCharT>
+ BasicNodeLocation(const BasicNodeLocation<OtherCharT>& other) {
+ set_from(other);
+ }
+
+ template<typename OtherCharT>
+ BasicNodeLocation& operator=(const BasicNodeLocation<OtherCharT>& other) {
+ set_from(other);
+ return *this;
+ }
+
+ const char_type* begin() const { return _begin; }
+ const char_type* end() const { return _end; }
+
+ bool is_synthesized() const { return _begin == nullptr && _end == nullptr; }
+
+ static BasicNodeLocation make_from(const char_type* begin, const char_type* end) {
+ end++;
+ if (begin >= end) return BasicNodeLocation(begin);
+ return BasicNodeLocation(begin, end);
+ }
};
+ using NodeLocation = BasicNodeLocation<char>;
+
struct FilePosition {
std::uint32_t start_line = std::uint32_t(-1), end_line = std::uint32_t(-1), start_column = std::uint32_t(-1), end_column = std::uint32_t(-1);