Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
e4d609c
Add new encoding tests and implementation
Dec 22, 2025
7bc2d4e
Remove old marshal stuff and return an empty string instead of throwing
Dec 22, 2025
6ea2cc2
update tests
Dec 22, 2025
c39a54c
Case change
Dec 23, 2025
bbc622b
Update utf16 codepoint encoder
Dec 23, 2025
bfe921d
Add some extra functions
Dec 23, 2025
f9fb825
copyTo function for view
Dec 23, 2025
12f7a7b
single bounds check for utf8 encode
Dec 23, 2025
f37b1b9
marshal writes
Dec 23, 2025
6384c45
remove some conversion issues
Dec 23, 2025
be9ff94
Remove un-needed cast
Dec 23, 2025
6ff0e28
Remove questionable implicit view to pointer conversions
Dec 23, 2025
03a98d2
int returns
Dec 23, 2025
c006fb4
switch to a dedicated codepoint function for utf16
Dec 23, 2025
4b5e40a
move to a dedicated codepoint function for utf8 as well
Dec 23, 2025
485e8b7
Fix incorrect index reuse
Dec 24, 2025
3dbceb9
Add new view extension cstring function tests
Dec 24, 2025
74e7e57
Add a smart strings guard
Dec 24, 2025
2078eae
const view
Dec 25, 2025
db7a3bb
const ref marshal read and writes
Dec 25, 2025
819044e
more const ref and less object copying
Dec 26, 2025
16078b9
Fix index reuse issue
Dec 26, 2025
695e134
separate build xml for encoding
Dec 27, 2025
111b3ba
Don't return hx::Throw result in non smart string case
Dec 27, 2025
ed3e568
Revert "separate build xml for encoding"
Dec 27, 2025
d477f6d
better smart string handling and shuffle some functions in lower hxcpp
Dec 27, 2025
0ce64e2
Revert some version guards
Dec 28, 2025
e7d9ba4
Add pointer check define
Dec 28, 2025
7fa0fae
Merge branch 'master' into cpp_encoding
Dec 28, 2025
e50dab9
I don't understand why this is needed
Dec 28, 2025
d31ea3a
remove addition since there must be something else weird going on
Dec 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
406 changes: 406 additions & 0 deletions .gitignore

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions include/cpp/encoding/Ascii.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once

namespace cpp
{
namespace encoding
{
struct Ascii final
{
static bool isEncoded(const String& string);

/// <summary>
/// Encode the provided string to ASCII bytes and write them to the buffer.
/// If the provided string is UTF16 encoded an exception is raised and nothing is written to the buffer.
/// </summary>
/// <returns>Number of chars written to the buffer.</returns>
static int64_t encode(const String& string, cpp::marshal::View<uint8_t> buffer);

/// <summary>
/// Create a string from the provided ASCII bytes.
/// </summary>
static String decode(cpp::marshal::View<uint8_t> string);
};
}
}
24 changes: 24 additions & 0 deletions include/cpp/encoding/Utf16.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once

namespace cpp
{
namespace encoding
{
struct Utf16 final
{
static bool isEncoded(const String& string);

static int getByteCount(const char32_t& codepoint);
static int64_t getByteCount(const String& string);

static int getCharCount(const char32_t& codepoint);
static int64_t getCharCount(const String& string);

static int encode(const char32_t& codepoint, const cpp::marshal::View<uint8_t>& buffer);
static int64_t encode(const String& string, const cpp::marshal::View<uint8_t>& buffer);

static char32_t codepoint(const cpp::marshal::View<uint8_t>& buffer);
static String decode(const cpp::marshal::View<uint8_t>& buffer);
};
}
}
22 changes: 22 additions & 0 deletions include/cpp/encoding/Utf8.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

namespace cpp
{
namespace encoding
{
struct Utf8 final
{
static int getByteCount(const char32_t& codepoint);
static int64_t getByteCount(const String& string);

static int getCharCount(const char32_t& codepoint);
static int64_t getCharCount(const String& string);

static int encode(const char32_t& codepoint, const cpp::marshal::View<uint8_t>& buffer);
static int64_t encode(const String& string, const cpp::marshal::View<uint8_t>& buffer);

static char32_t codepoint(const cpp::marshal::View<uint8_t>& buffer);
static String decode(const cpp::marshal::View<uint8_t>& buffer);
};
}
}
168 changes: 78 additions & 90 deletions include/cpp/marshal/Definitions.inc
Original file line number Diff line number Diff line change
Expand Up @@ -197,23 +197,20 @@ namespace cpp

View(::cpp::Pointer<T> _ptr, int64_t _length);

void clear();
void fill(T value);
bool isEmpty();
View<T> slice(int64_t index);
View<T> slice(int64_t index, int64_t length);
bool tryCopyTo(const View<T>& destination);
template<class K> View<K> reinterpret();
int compare(const View<T>& inRHS);
void clear() const;
void fill(T value) const;
bool isEmpty() const;
View<T> slice(int64_t index) const;
View<T> slice(int64_t index, int64_t length) const;
void copyTo(const View<T>& destination) const;
bool tryCopyTo(const View<T>& destination) const;
template<class K> View<K> reinterpret() const;
int compare(const View<T>& inRHS) const;

bool operator==(const View<T>& inRHS) const;
bool operator!=(const View<T>& inRHS) const;

T& operator[] (int64_t index);

operator void* ();
operator T* ();
operator Pointer<T>();
T& operator[] (int64_t index) const;
};

struct Marshal final
Expand All @@ -224,83 +221,74 @@ namespace cpp
static const bool isBigEndian = false;
#endif

static View<char> asView(const char* cstring);
static View<char16_t> asView(const char16_t* cstring);

static View<char> toCharView(const ::String& string);
static int toCharView(const ::String&, View<char> buffer);

static View<char16_t> toWideCharView(const ::String& string);
static int toWideCharView(const ::String& string, View<char16_t> buffer);

static ::String toString(View<char> buffer);
static ::String toString(View<char16_t> buffer);

template<class T> static T read(View<uint8_t> view);
template<class T> static ::cpp::Pointer<T> readPointer(View<uint8_t> view);
static int8_t readInt8(View<uint8_t> view);
static int16_t readInt16(View<uint8_t> view);
static int32_t readInt32(View<uint8_t> view);
static int64_t readInt64(View<uint8_t> view);
static uint8_t readUInt8(View<uint8_t> view);
static uint16_t readUInt16(View<uint8_t> view);
static uint32_t readUInt32(View<uint8_t> view);
static uint64_t readUInt64(View<uint8_t> view);
static float readFloat32(View<uint8_t> view);
static double readFloat64(View<uint8_t> view);

template<class T> static ::cpp::Pointer<T> readLittleEndianPointer(View<uint8_t> view);
static int16_t readLittleEndianInt16(View<uint8_t> view);
static int32_t readLittleEndianInt32(View<uint8_t> view);
static int64_t readLittleEndianInt64(View<uint8_t> view);
static uint16_t readLittleEndianUInt16(View<uint8_t> view);
static uint32_t readLittleEndianUInt32(View<uint8_t> view);
static uint64_t readLittleEndianUInt64(View<uint8_t> view);
static float readLittleEndianFloat32(View<uint8_t> view);
static double readLittleEndianFloat64(View<uint8_t> view);

template<class T> static ::cpp::Pointer<T> readBigEndianPointer(View<uint8_t> view);
static int16_t readBigEndianInt16(View<uint8_t> view);
static int32_t readBigEndianInt32(View<uint8_t> view);
static int64_t readBigEndianInt64(View<uint8_t> view);
static uint16_t readBigEndianUInt16(View<uint8_t> view);
static uint32_t readBigEndianUInt32(View<uint8_t> view);
static uint64_t readBigEndianUInt64(View<uint8_t> view);
static float readBigEndianFloat32(View<uint8_t> view);
static double readBigEndianFloat64(View<uint8_t> view);

template<class T> static void write(View<uint8_t> view, const T& value);
template<class T> static void writePointer(View<uint8_t> view, const Pointer<T>& value);
static void writeInt8(View<uint8_t> view, const int8_t& value);
static void writeInt16(View<uint8_t> view, const int16_t& value);
static void writeInt32(View<uint8_t> view, const int32_t& value);
static void writeInt64(View<uint8_t> view, const int64_t& value);
static void writeUInt8(View<uint8_t> view, const uint8_t& value);
static void writeUInt16(View<uint8_t> view, const uint16_t& value);
static void writeUInt32(View<uint8_t> view, const uint32_t& value);
static void writeUInt64(View<uint8_t> view, const uint64_t& value);
static void writeFloat32(View<uint8_t> view, const float& value);
static void writeFloat64(View<uint8_t> view, const double& value);

template<class T> static void writeLittleEndianPointer(View<uint8_t> view, const Pointer<T>& value);
static void writeLittleEndianInt16(View<uint8_t> view, const int16_t& value);
static void writeLittleEndianInt32(View<uint8_t> view, const int32_t& value);
static void writeLittleEndianInt64(View<uint8_t> view, const int64_t& value);
static void writeLittleEndianUInt16(View<uint8_t> view, const uint16_t& value);
static void writeLittleEndianUInt32(View<uint8_t> view, const uint32_t& value);
static void writeLittleEndianUInt64(View<uint8_t> view, const uint64_t& value);
static void writeLittleEndianFloat32(View<uint8_t> view, const float& value);
static void writeLittleEndianFloat64(View<uint8_t> view, const double& value);

template<class T> static void writeBigEndianPointer(View<uint8_t> view, const Pointer<T>& value);
static void writeBigEndianInt16(View<uint8_t> view, const int16_t& value);
static void writeBigEndianInt32(View<uint8_t> view, const int32_t& value);
static void writeBigEndianInt64(View<uint8_t> view, const int64_t& value);
static void writeBigEndianUInt16(View<uint8_t> view, const uint16_t& value);
static void writeBigEndianUInt32(View<uint8_t> view, const uint32_t& value);
static void writeBigEndianUInt64(View<uint8_t> view, const uint64_t& value);
static void writeBigEndianFloat32(View<uint8_t> view, const float& value);
static void writeBigEndianFloat64(View<uint8_t> view, const double& value);
static View<char> asCharView(const ::String& string);
static View<char16_t> asWideCharView(const ::String& string);

template<class T> static T read(const View<uint8_t>& view);
template<class T> static ::cpp::Pointer<T> readPointer(const View<uint8_t>& view);
static int8_t readInt8(const View<uint8_t>& view);
static int16_t readInt16(const View<uint8_t>& view);
static int32_t readInt32(const View<uint8_t>& view);
static int64_t readInt64(const View<uint8_t>& view);
static uint8_t readUInt8(const View<uint8_t>& view);
static uint16_t readUInt16(const View<uint8_t>& view);
static uint32_t readUInt32(const View<uint8_t>& view);
static uint64_t readUInt64(const View<uint8_t>& view);
static float readFloat32(const View<uint8_t>& view);
static double readFloat64(const View<uint8_t>& view);

template<class T> static ::cpp::Pointer<T> readLittleEndianPointer(const View<uint8_t>& view);
static int16_t readLittleEndianInt16(const View<uint8_t>& view);
static int32_t readLittleEndianInt32(const View<uint8_t>& view);
static int64_t readLittleEndianInt64(const View<uint8_t>& view);
static uint16_t readLittleEndianUInt16(const View<uint8_t>& view);
static uint32_t readLittleEndianUInt32(const View<uint8_t>& view);
static uint64_t readLittleEndianUInt64(const View<uint8_t>& view);
static float readLittleEndianFloat32(const View<uint8_t>& view);
static double readLittleEndianFloat64(const View<uint8_t>& view);

template<class T> static ::cpp::Pointer<T> readBigEndianPointer(const View<uint8_t>& view);
static int16_t readBigEndianInt16(const View<uint8_t>& view);
static int32_t readBigEndianInt32(const View<uint8_t>& view);
static int64_t readBigEndianInt64(const View<uint8_t>& view);
static uint16_t readBigEndianUInt16(const View<uint8_t>& view);
static uint32_t readBigEndianUInt32(const View<uint8_t>& view);
static uint64_t readBigEndianUInt64(const View<uint8_t>& view);
static float readBigEndianFloat32(const View<uint8_t>& view);
static double readBigEndianFloat64(const View<uint8_t>& view);

template<class T> static void write(const View<uint8_t>& view, const T& value);
template<class T> static void writePointer(const View<uint8_t>& view, const Pointer<T>& value);
static void writeInt8(const View<uint8_t>& view, const int8_t& value);
static void writeInt16(const View<uint8_t>& view, const int16_t& value);
static void writeInt32(const View<uint8_t>& view, const int32_t& value);
static void writeInt64(const View<uint8_t>& view, const int64_t& value);
static void writeUInt8(const View<uint8_t>& view, const uint8_t& value);
static void writeUInt16(const View<uint8_t>& view, const uint16_t& value);
static void writeUInt32(const View<uint8_t>& view, const uint32_t& value);
static void writeUInt64(const View<uint8_t>& view, const uint64_t& value);
static void writeFloat32(const View<uint8_t>& view, const float& value);
static void writeFloat64(const View<uint8_t>& view, const double& value);

template<class T> static void writeLittleEndianPointer(const View<uint8_t>& view, const Pointer<T>& value);
static void writeLittleEndianInt16(const View<uint8_t>& view, const int16_t& value);
static void writeLittleEndianInt32(const View<uint8_t>& view, const int32_t& value);
static void writeLittleEndianInt64(const View<uint8_t>& view, const int64_t& value);
static void writeLittleEndianUInt16(const View<uint8_t>& view, const uint16_t& value);
static void writeLittleEndianUInt32(const View<uint8_t>& view, const uint32_t& value);
static void writeLittleEndianUInt64(const View<uint8_t>& view, const uint64_t& value);
static void writeLittleEndianFloat32(const View<uint8_t>& view, const float& value);
static void writeLittleEndianFloat64(const View<uint8_t>& view, const double& value);

template<class T> static void writeBigEndianPointer(const View<uint8_t>& view, const Pointer<T>& value);
static void writeBigEndianInt16(const View<uint8_t>& view, const int16_t& value);
static void writeBigEndianInt32(const View<uint8_t>& view, const int32_t& value);
static void writeBigEndianInt64(const View<uint8_t>& view, const int64_t& value);
static void writeBigEndianUInt16(const View<uint8_t>& view, const uint16_t& value);
static void writeBigEndianUInt32(const View<uint8_t>& view, const uint32_t& value);
static void writeBigEndianUInt64(const View<uint8_t>& view, const uint64_t& value);
static void writeBigEndianFloat32(const View<uint8_t>& view, const float& value);
static void writeBigEndianFloat64(const View<uint8_t>& view, const double& value);
};
}
}
Expand Down
Loading
Loading