JsonStringCompact¶
JsonStringCompact represents immutable UTF-8 encoded string values in the Hakka JSON library. It inherits from JsonPrimitiveCompact<JsonStringCompact, scc::PicoStringProxy> and uses the CRTP pattern for compile-time polymorphism.
Header: include/hakka_json_string.hpp
Type Definitions¶
using ValueType = scc::PicoStringProxy;
Storage¶
JsonStringCompact uses PicoString for memory-efficient string storage with size-based optimization:
- 0 bytes: Empty string (special case)
- 1 byte:
PicoString1 - 2 bytes:
PicoString2 - 4 bytes:
PicoString4 - 8 bytes:
PicoString8 - 16 bytes:
PicoString16 - 32 bytes:
PicoString32 - 64 bytes:
PicoString64 - >64 bytes:
PicoStringUnlimited
Factory Methods¶
create (string_view)¶
[[nodiscard]] static JsonHandleCompact create(std::string_view value);
Creates a JsonStringCompact instance from a string view. Automatically deduplicates identical values.
-
Parameters:
value: The string view (std::string_view).
-
Returns:
- A
JsonHandleCompactthat references the createdJsonStringCompactinstance.
- A
-
Error Handling:
- Throws
std::bad_allocif memory allocation fails. - Exception safety: Basic guarantee.
- Throws
-
Complexity:
- \(O(1)\) average case time complexity (hash table lookup/insert with deduplication).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello"); assert(handle.get_type() == HAKKA_JSON_STRING);
create (std::string)¶
[[nodiscard]] static JsonHandleCompact create(const std::string &value);
Creates a JsonStringCompact instance from a std::string.
-
Parameters:
value: The string (std::string).
-
Returns:
- A
JsonHandleCompactthat references the createdJsonStringCompactinstance.
- A
-
Error Handling:
- Throws
std::bad_allocif memory allocation fails. - Exception safety: Basic guarantee.
- Throws
-
Complexity:
- \(O(1)\) average case time complexity (hash table lookup/insert with deduplication).
-
Thread Safety:
- This function is thread-safe.
-
Example:
std::string str = "world"; auto handle = JsonStringCompact::create(str);
create (C-string)¶
template <size_t N>
[[nodiscard]] static JsonHandleCompact create(const char (&value)[N]);
Creates a JsonStringCompact instance from a C-string literal.
-
Parameters:
value: The C-string literal.
-
Returns:
- A
JsonHandleCompactthat references the createdJsonStringCompactinstance.
- A
-
Error Handling:
- Throws
std::bad_allocif memory allocation fails. - Exception safety: Basic guarantee.
- Throws
-
Complexity:
- \(O(1)\) average case time complexity (hash table lookup/insert with deduplication).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("literal");
create_unique (string_view)¶
[[nodiscard]] static std::unique_ptr<JsonStringCompact> create_unique(std::string_view value);
Creates a unique pointer to a JsonStringCompact instance. Does not deduplicate values.
-
Parameters:
value: The string view (std::string_view).
-
Returns:
- A
std::unique_ptr<JsonStringCompact>owning the created instance. - Returns
nullptrif memory allocation fails.
- A
-
Error Handling:
- Returns
nullptron allocation failure (usesnew (std::nothrow)). - No exceptions thrown.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is string length (copies string data).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto strPtr = JsonStringCompact::create_unique("unique"); if (strPtr) { // Use strPtr }
Serialization Methods¶
dump¶
tl::expected<std::string, HakkaJsonResultEnum> dump(uint32_t max_depth = 0) const;
Serializes the string to JSON format with proper escaping.
-
Parameters:
max_depth: Unused forJsonStringCompact; included for interface consistency.
-
Returns:
- On success: A
std::stringcontaining the JSON-escaped string (with surrounding quotes). - On failure:
HAKKA_JSON_INTERNAL_ERROR(rare, occurs on exception).
- On success: A
-
Error Handling:
- Returns
HAKKA_JSON_INTERNAL_ERRORif exception occurs during escaping. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length (scans and escapes characters).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello\nworld"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->dump(); if (result) { std::cout << result.value() << std::endl; // Output: "hello\nworld" } }
to_bytes¶
HakkaJsonResultEnum to_bytes(char *buffer, uint32_t *buffer_size) const;
Serializes the string into a null-terminated byte buffer.
-
Parameters:
buffer: Pointer to the destination byte buffer.buffer_size: Pointer to the buffer size. On input, specifies the buffer capacity. On output, contains the number of bytes written (excluding null terminator) or the required size if buffer is too small.
-
Returns:
HAKKA_JSON_SUCCESSif serialization succeeds.HAKKA_JSON_NOT_ENOUGH_MEMORYif the buffer is too small. The required size is written to*buffer_size.HAKKA_JSON_INTERNAL_ERRORif an exception occurs.
-
Error Handling:
- Returns
HAKKA_JSON_NOT_ENOUGH_MEMORYwhen buffer is insufficient. - Returns
HAKKA_JSON_INTERNAL_ERRORon exception. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("test"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { char buffer[100]; uint32_t size = sizeof(buffer); auto result = (*str_ptr)->to_bytes(buffer, &size); if (result == HAKKA_JSON_SUCCESS) { std::cout << buffer << std::endl; // Output: "test" } }
dump_size¶
uint64_t dump_size() const;
Calculates the size of the serialized JSON string.
-
Parameters:
- None.
-
Returns:
- The number of bytes required to serialize the string (including quotes and escape sequences).
-
Error Handling:
- None (assumes
dump()succeeds). - Exception safety: Strong guarantee.
- None (assumes
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length (calls
dump()internally).
- \(O(n)\) time complexity, where \(n\) is the string length (calls
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("test"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { uint64_t size = (*str_ptr)->dump_size(); std::cout << "Size: " << size << std::endl; // Output: Size: 6 (for "test") }
Type Information Methods¶
type¶
HakkaJsonType type() const;
Returns the JSON type of this instance.
-
Parameters:
- None.
-
Returns:
HAKKA_JSON_STRING
-
Error Handling:
- None.
- Exception safety: No-throw guarantee.
-
Complexity:
- \(\Theta(1)\) time complexity.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("test"); HakkaJsonType t = handle.get_type(); assert(t == HAKKA_JSON_STRING);
Comparison Methods¶
compare¶
tl::expected<int, HakkaJsonResultEnum> compare(const JsonHandleCompact &other) const;
Compares this string with another JSON string lexicographically.
-
Parameters:
other: TheJsonHandleCompactto compare against.
-
Returns:
- On success: An integer comparison result:
< 0if this string is less thanother0if this string equalsother> 0if this string is greater thanother
- On failure:
HAKKA_JSON_TYPE_ERRORifotheris notSTRING.
- On success: An integer comparison result:
-
Error Handling:
- Returns
HAKKA_JSON_TYPE_ERRORif type is incompatible. - Returns
HAKKA_JSON_INTERNAL_ERRORon exception. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(\min(n, m))\) time complexity, where \(n\) and \(m\) are the string lengths.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle1 = JsonStringCompact::create("apple"); auto handle2 = JsonStringCompact::create("banana"); auto view1 = handle1.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view1)) { auto result = (*str_ptr)->compare(handle2); if (result) { assert(result.value() < 0); // "apple" < "banana" } }
hash¶
uint64_t hash() const;
Computes the hash value of the string using std::hash<std::string>.
-
Parameters:
- None.
-
Returns:
- A 64-bit hash value.
-
Error Handling:
- None.
- Exception safety: No-throw guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { uint64_t h = (*str_ptr)->hash(); std::cout << "Hash: " << h << std::endl; }
Value Access Methods¶
get¶
tl::expected<PrimitiveType, HakkaJsonResultEnum> get() const;
Retrieves the string value stored in this instance.
-
Parameters:
- None.
-
Returns:
- On success: A
PrimitiveTypecontaining thestd::stringvalue. - On failure: Error (rare, should not occur for valid instances).
- On success: A
-
Error Handling:
- No errors expected for valid instances.
- Exception safety: No-throw guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length (copies string).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto value = (*str_ptr)->get(); if (value) { std::string str_val = std::get<std::string>(value.value()); std::cout << "Value: " << str_val << std::endl; } }
Reference Counting Methods¶
inc_ref¶
uint64_t inc_ref() const;
Increments the reference count atomically.
-
Parameters:
- None.
-
Returns:
- The new reference count after incrementing.
-
Error Handling:
- None.
- Exception safety: No-throw guarantee.
-
Complexity:
- \(\Theta(1)\) time complexity.
-
Thread Safety:
- This function is thread-safe (uses atomic operations with
memory_order_relaxed).
- This function is thread-safe (uses atomic operations with
-
Example:
auto handle = JsonStringCompact::create("test"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { uint64_t count = (*str_ptr)->inc_ref(); std::cout << "New ref count: " << count << std::endl; }
dec_ref¶
uint64_t dec_ref() const;
Decrements the reference count atomically.
-
Parameters:
- None.
-
Returns:
- The new reference count after decrementing.
-
Error Handling:
- None.
- Exception safety: No-throw guarantee.
-
Complexity:
- \(\Theta(1)\) time complexity.
-
Thread Safety:
- This function is thread-safe (uses atomic operations with
memory_order_relaxed).
- This function is thread-safe (uses atomic operations with
-
Example:
auto handle = JsonStringCompact::create("test"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { uint64_t count = (*str_ptr)->dec_ref(); std::cout << "New ref count: " << count << std::endl; // Note: Manually calling dec_ref() is not recommended; use Handle system }
Warning
Manual reference counting is intended for Python FFI integration. Normal usage should rely on the JsonHandleCompact system for automatic reference management.
String Information Methods¶
length¶
tl::expected<int64_t, HakkaJsonResultEnum> length() const;
Returns the number of Unicode characters (not bytes) in the string.
-
Parameters:
- None.
-
Returns:
- On success: The number of Unicode characters (UTF-32 code points).
- On failure: Error (rare).
-
Error Handling:
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the byte length (converts to ICU UnicodeString).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("繁體中文"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto len = (*str_ptr)->length(); if (len) { std::cout << "Length: " << len.value() << std::endl; // Output: 4 } }
utf8_length¶
tl::expected<uint64_t, HakkaJsonResultEnum> utf8_length() const;
Returns the number of bytes in the UTF-8 encoded string.
-
Parameters:
- None.
-
Returns:
- The number of bytes in the string.
-
Error Handling:
- None.
- Exception safety: No-throw guarantee.
-
Complexity:
- \(\Theta(1)\) time complexity (returns stored size).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("繁體中文"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto bytes = (*str_ptr)->utf8_length(); if (bytes) { std::cout << "Bytes: " << bytes.value() << std::endl; // Output: 12 } }
String Manipulation Methods¶
capitalize¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> capitalize() const;
Returns a capitalized version of the string (first character uppercase, rest lowercase).
-
Parameters:
- None.
-
Returns:
- On success: A new
JsonHandleCompactwith the capitalized string. - On failure: Error (rare).
- On success: A new
-
Error Handling:
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello WORLD"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->capitalize(); if (result) { auto result_view = result.value().get_view(); if (auto* result_ptr = std::get_if<const JsonStringCompact*>(&result_view)) { auto str = (*result_ptr)->get(); std::cout << std::get<std::string>(str.value()) << std::endl; // Output: "Hello world" } } }
casefold¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> casefold() const;
Returns a casefolded version of the string (lowercase for case-insensitive comparison).
-
Parameters:
- None.
-
Returns:
- On success: A new
JsonHandleCompactwith the casefolded string. - On failure: Error (rare).
- On success: A new
-
Error Handling:
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("HELLO"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->casefold(); // Output: "hello" }
lower¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> lower() const;
Returns a lowercase version of the string.
-
Parameters:
- None.
-
Returns:
- On success: A new
JsonHandleCompactwith the lowercase string. - On failure:
HAKKA_JSON_NOT_ENOUGH_MEMORYorHAKKA_JSON_INTERNAL_ERROR.
- On success: A new
-
Error Handling:
- Returns
HAKKA_JSON_NOT_ENOUGH_MEMORYif memory allocation fails. - Returns
HAKKA_JSON_INTERNAL_ERRORon exception. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("HELLO"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->lower(); // Output: "hello" }
upper¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> upper() const;
Returns an uppercase version of the string.
-
Parameters:
- None.
-
Returns:
- On success: A new
JsonHandleCompactwith the uppercase string. - On failure:
HAKKA_JSON_NOT_ENOUGH_MEMORYorHAKKA_JSON_INTERNAL_ERROR.
- On success: A new
-
Error Handling:
- Returns
HAKKA_JSON_NOT_ENOUGH_MEMORYif memory allocation fails. - Returns
HAKKA_JSON_INTERNAL_ERRORon exception. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->upper(); // Output: "HELLO" }
swapcase¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> swapcase() const;
Returns a string with case swapped (uppercase becomes lowercase and vice versa).
-
Parameters:
- None.
-
Returns:
- On success: A new
JsonHandleCompactwith the swapped-case string. - On failure:
HAKKA_JSON_NOT_ENOUGH_MEMORYorHAKKA_JSON_INTERNAL_ERROR.
- On success: A new
-
Error Handling:
- Returns
HAKKA_JSON_NOT_ENOUGH_MEMORYif memory allocation fails. - Returns
HAKKA_JSON_INTERNAL_ERRORon exception. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("Hello"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->swapcase(); // Output: "hELLO" }
title¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> title() const;
Returns a titlecased version of the string (first character of each word capitalized).
-
Parameters:
- None.
-
Returns:
- On success: A new
JsonHandleCompactwith the titlecased string. - On failure:
HAKKA_JSON_NOT_ENOUGH_MEMORYorHAKKA_JSON_INTERNAL_ERROR.
- On success: A new
-
Error Handling:
- Returns
HAKKA_JSON_NOT_ENOUGH_MEMORYif memory allocation fails. - Returns
HAKKA_JSON_INTERNAL_ERRORon exception. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->title(); // Output: "Hello World" }
count¶
tl::expected<int64_t, HakkaJsonResultEnum> count(std::string_view substring) const;
Returns the number of non-overlapping occurrences of substring.
-
Parameters:
substring: The substring to count.
-
Returns:
- The number of occurrences.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n \cdot m)\) time complexity, where \(n\) is the string length and \(m\) is the substring length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->count("hello"); if (result) { std::cout << "Count: " << result.value() << std::endl; // Output: 2 } }
find¶
tl::expected<int64_t, HakkaJsonResultEnum> find(std::string_view substring) const;
Returns the lowest index where substring is found, or -1 if not found.
-
Parameters:
substring: The substring to find.
-
Returns:
- The index of the first occurrence, or
-1if not found.
- The index of the first occurrence, or
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n \cdot m)\) time complexity, where \(n\) is the string length and \(m\) is the substring length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->find("world"); if (result) { std::cout << "Index: " << result.value() << std::endl; // Output: 6 } }
rfind¶
tl::expected<int64_t, HakkaJsonResultEnum> rfind(std::string_view substring) const;
Returns the highest index where substring is found, or -1 if not found.
-
Parameters:
substring: The substring to find.
-
Returns:
- The index of the last occurrence, or
-1if not found.
- The index of the last occurrence, or
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n \cdot m)\) time complexity, where \(n\) is the string length and \(m\) is the substring length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->rfind("hello"); if (result) { std::cout << "Index: " << result.value() << std::endl; // Output: 6 } }
startswith¶
tl::expected<bool, HakkaJsonResultEnum> startswith(std::string_view prefix) const;
Returns true if the string starts with the specified prefix.
-
Parameters:
prefix: The prefix to check.
-
Returns:
trueif the string starts with the prefix,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(m)\) time complexity, where \(m\) is the prefix length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->startswith("hello"); if (result) { assert(result.value() == true); } }
endswith¶
tl::expected<bool, HakkaJsonResultEnum> endswith(std::string_view suffix) const;
Returns true if the string ends with the specified suffix.
-
Parameters:
suffix: The suffix to check.
-
Returns:
trueif the string ends with the suffix,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(m)\) time complexity, where \(m\) is the suffix length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->endswith("world"); if (result) { assert(result.value() == true); } }
removeprefix¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> removeprefix(std::string_view prefix) const;
Returns a new string with the prefix removed if it exists.
-
Parameters:
prefix: The prefix to remove.
-
Returns:
- On success: A new
JsonHandleCompactwith the prefix removed (or original string if prefix not found). - On failure: Error (rare).
- On success: A new
-
Error Handling:
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->removeprefix("hello "); // Result: "world" }
removesuffix¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> removesuffix(std::string_view suffix) const;
Returns a new string with the suffix removed if it exists.
-
Parameters:
suffix: The suffix to remove.
-
Returns:
- On success: A new
JsonHandleCompactwith the suffix removed (or original string if suffix not found). - On failure: Error (rare).
- On success: A new
-
Error Handling:
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->removesuffix(" world"); // Result: "hello" }
replace¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> replace(std::string_view old_substr, std::string_view new_substr) const;
Returns a new string with all occurrences of old_substr replaced by new_substr.
-
Parameters:
old_substr: The substring to replace.new_substr: The replacement substring.
-
Returns:
- On success: A new
JsonHandleCompactwith replacements made. - On failure: Error (rare).
- On success: A new
-
Error Handling:
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n \cdot m)\) time complexity, where \(n\) is the string length and \(m\) is the old substring length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->replace("world", "universe"); // Result: "hello universe" }
concatenate¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> concatenate(std::string_view other) const;
Returns a new string that is the concatenation of this string and another.
-
Parameters:
other: The string to concatenate.
-
Returns:
- On success: A new
JsonHandleCompactwith the concatenated string. - On failure: Error (rare).
- On success: A new
-
Error Handling:
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n + m)\) time complexity, where \(n\) and \(m\) are the string lengths.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->concatenate(" world"); // Result: "hello world" }
multiply¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> multiply(int64_t times) const;
Returns a new string that is this string repeated times times.
-
Parameters:
times: The number of repetitions.
-
Returns:
- On success: A new
JsonHandleCompactwith the repeated string. - On failure:
HAKKA_JSON_NOT_ENOUGH_MEMORYif memory allocation fails.
- On success: A new
-
Error Handling:
- Returns
HAKKA_JSON_NOT_ENOUGH_MEMORYif memory allocation fails. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n \cdot times)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("ha"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->multiply(3); // Result: "hahaha" }
slice¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> slice(int64_t start, int64_t stop, int64_t step = 1) const;
Returns a substring using Python-style slicing.
-
Parameters:
start: The starting index (can be negative).stop: The ending index (can be negative).step: The step size (default 1).
-
Returns:
- On success: A new
JsonHandleCompactwith the sliced substring. - On failure:
HAKKA_JSON_INDEX_OUT_OF_BOUNDSif indices are invalid.
- On success: A new
-
Error Handling:
- Returns
HAKKA_JSON_INDEX_OUT_OF_BOUNDSif indices are out of range. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the resulting substring length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->slice(0, 5, 1); // Result: "hello" }
split¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> split(std::string_view separator, int64_t maxsplit = -1) const;
Splits the string into an array of substrings using the separator.
-
Parameters:
separator: The separator string (empty string splits into individual characters).maxsplit: Maximum number of splits (default -1 means no limit).
-
Returns:
- On success: A
JsonHandleCompactreferencing aJsonArrayCompactcontaining the split substrings. - On failure:
HAKKA_JSON_INTERNAL_ERROR.
- On success: A
-
Error Handling:
- Returns
HAKKA_JSON_INTERNAL_ERRORon failure. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("a,b,c"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->split(",", -1); // Result: ["a", "b", "c"] }
rsplit¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> rsplit(std::string_view separator, int64_t maxsplit = -1) const;
Splits the string from the right using the separator.
-
Parameters:
separator: The separator string (empty string splits into individual characters).maxsplit: Maximum number of splits (default -1 means no limit).
-
Returns:
- On success: A
JsonHandleCompactreferencing aJsonArrayCompactcontaining the split substrings. - On failure:
HAKKA_JSON_INTERNAL_ERROR.
- On success: A
-
Error Handling:
- Returns
HAKKA_JSON_INTERNAL_ERRORon failure. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("a,b,c"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->rsplit(",", 1); // Result: ["a,b", "c"] }
splitlines¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> splitlines(bool keepends = false) const;
Splits the string at line boundaries.
-
Parameters:
keepends: Iftrue, line breaks are included in the resulting substrings (defaultfalse).
-
Returns:
- On success: A
JsonHandleCompactreferencing aJsonArrayCompactcontaining the lines. - On failure:
HAKKA_JSON_INTERNAL_ERROR.
- On success: A
-
Error Handling:
- Returns
HAKKA_JSON_INTERNAL_ERRORon failure. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello\nworld\n"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->splitlines(false); // Result: ["hello", "world"] }
zfill¶
tl::expected<JsonHandleCompact, HakkaJsonResultEnum> zfill(int64_t width) const;
Pads the string on the left with zeros to fill the specified width.
-
Parameters:
width: The target width.
-
Returns:
- On success: A new
JsonHandleCompactwith the zero-padded string. - On failure:
HAKKA_JSON_NOT_ENOUGH_MEMORYif memory allocation fails.
- On success: A new
-
Error Handling:
- Returns
HAKKA_JSON_NOT_ENOUGH_MEMORYif memory allocation fails. - Exception safety: Strong guarantee.
- Returns
-
Complexity:
- \(O(width)\) time complexity.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("42"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->zfill(5); // Result: "00042" }
String Testing Methods¶
isalnum¶
tl::expected<bool, HakkaJsonResultEnum> isalnum() const;
Returns true if all characters are alphanumeric and string is non-empty.
-
Parameters:
- None.
-
Returns:
trueif all characters are alphanumeric,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("abc123"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isalnum(); if (result) { assert(result.value() == true); } }
isalpha¶
tl::expected<bool, HakkaJsonResultEnum> isalpha() const;
Returns true if all characters are alphabetic and string is non-empty.
-
Parameters:
- None.
-
Returns:
trueif all characters are alphabetic,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("abc"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isalpha(); if (result) { assert(result.value() == true); } }
isascii¶
tl::expected<bool, HakkaJsonResultEnum> isascii() const;
Returns true if all characters are ASCII (code points < 128).
-
Parameters:
- None.
-
Returns:
trueif all characters are ASCII,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isascii(); if (result) { assert(result.value() == true); } }
isdecimal¶
tl::expected<bool, HakkaJsonResultEnum> isdecimal() const;
Returns true if all characters are decimal digits and string is non-empty.
-
Parameters:
- None.
-
Returns:
trueif all characters are decimal digits,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("12345"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isdecimal(); if (result) { assert(result.value() == true); } }
isdigit¶
tl::expected<bool, HakkaJsonResultEnum> isdigit() const;
Returns true if all characters are digits and string is non-empty.
-
Parameters:
- None.
-
Returns:
trueif all characters are digits,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("12345"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isdigit(); if (result) { assert(result.value() == true); } }
isidentifier¶
tl::expected<bool, HakkaJsonResultEnum> isidentifier() const;
Returns true if the string is a valid identifier.
-
Parameters:
- None.
-
Returns:
trueif the string is a valid identifier,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("variable_name"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isidentifier(); if (result) { assert(result.value() == true); } }
islower¶
tl::expected<bool, HakkaJsonResultEnum> islower() const;
Returns true if all cased characters are lowercase and string is non-empty.
-
Parameters:
- None.
-
Returns:
trueif all cased characters are lowercase,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->islower(); if (result) { assert(result.value() == true); } }
isnumeric¶
tl::expected<bool, HakkaJsonResultEnum> isnumeric() const;
Returns true if all characters are numeric and string is non-empty.
-
Parameters:
- None.
-
Returns:
trueif all characters are numeric,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("12345"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isnumeric(); if (result) { assert(result.value() == true); } }
isprintable¶
tl::expected<bool, HakkaJsonResultEnum> isprintable() const;
Returns true if all characters are printable or string is empty.
-
Parameters:
- None.
-
Returns:
trueif all characters are printable,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isprintable(); if (result) { assert(result.value() == true); } }
isspace¶
tl::expected<bool, HakkaJsonResultEnum> isspace() const;
Returns true if all characters are whitespace and string is non-empty.
-
Parameters:
- None.
-
Returns:
trueif all characters are whitespace,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create(" "); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isspace(); if (result) { assert(result.value() == true); } }
istitle¶
tl::expected<bool, HakkaJsonResultEnum> istitle() const;
Returns true if the string is titlecased.
-
Parameters:
- None.
-
Returns:
trueif the string is titlecased,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("Hello World"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->istitle(); if (result) { assert(result.value() == true); } }
isupper¶
tl::expected<bool, HakkaJsonResultEnum> isupper() const;
Returns true if all cased characters are uppercase and string is non-empty.
-
Parameters:
- None.
-
Returns:
trueif all cased characters are uppercase,falseotherwise.
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity, where \(n\) is the string length.
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("HELLO"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto result = (*str_ptr)->isupper(); if (result) { assert(result.value() == true); } }
Iterator Methods¶
begin¶
JsonStringCompactIter begin() const;
Returns an iterator to the beginning of the string.
-
Parameters:
- None.
-
Returns:
- A
JsonStringCompactIterpointing to the first Unicode character.
- A
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity (converts to ICU UnicodeString).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("hello"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { for (auto it = (*str_ptr)->begin(); it != (*str_ptr)->end(); ++it) { char32_t c = *it; // Process each Unicode character } }
end¶
JsonStringCompactIter end() const;
Returns an iterator to the end of the string.
-
Parameters:
- None.
-
Returns:
- A
JsonStringCompactIterpointing past the last Unicode character.
- A
-
Error Handling:
- None.
- Exception safety: Strong guarantee.
-
Complexity:
- \(O(n)\) time complexity (converts to ICU UnicodeString).
-
Thread Safety:
- This function is thread-safe.
-
Example:
auto handle = JsonStringCompact::create("world"); auto view = handle.get_view(); if (auto* str_ptr = std::get_if<const JsonStringCompact*>(&view)) { auto it = (*str_ptr)->end(); // Used for loop termination }
Memory Management¶
JsonStringCompact uses automatic value deduplication. When multiple handles are created with the same string value, they reference the same underlying object:
auto handle1 = JsonStringCompact::create("hello");
auto handle2 = JsonStringCompact::create("hello");
// Both handles reference the same JsonStringCompact instance
The instance is destroyed when its reference count reaches zero.