- NIL
- NIL
- NIL
- NIL
- NIL
- NIL
- CMake Simplification: Drastically simplified CMake configuration for header-only library
- Binary Packaging: Removed all binary package generation (TGZ/ZIP archives, DEB, RPM, WIX MSI)
- Critical: Removed strict compiler warnings from library INTERFACE target
- Strict compiler warning options:
/W4 /WXfor MSVC and-Wall -Wextra -Werrorfor GCC/Clang
- Refactored
PredicateOperationstests to usestd::string_viewinstead ofstd::string
- Initialized result variables in numeric parsing benchmarks to avoid potential undefined behavior warnings
- Corrected variable naming in Unicode sample language greeting loop to avoid shadowing
- Refactored
isNullOrWhiteSpace()implementation to usestd::all_offor improved readability - Updated Google Benchmark dependency from 1.9.4 to 1.9.5
- JSON Escaping: Forward slash escaping now optional (BREAKING CHANGE)
jsonEscape()- Added optionalescapeForHtmlparameter (default: false)- Forward slashes (
/) are no longer escaped by default per RFC 8259 (optional escaping) - Set
escapeForHtml=truewhen embedding JSON in HTML to escape/as\/(prevents</script>and</style>tag issues)
- UTF-8 Utilities: Unicode codepoint encoding and decoding
decodeUtf8Codepoint()- Decode UTF-8 byte sequences to Unicode codepoints with full validationencodeUtf8Codepoint()- Encode Unicode codepoints to UTF-8 byte sequencesutf8Length()- Count Unicode codepoints in a UTF-8 string (not bytes)isValidUtf8()- Validate that a string contains valid UTF-8 encodingutf8Substring()- Extract substring by codepoint positions (zero-copy, returnsstring_view)- Supports all valid Unicode ranges (U+0000 to U+10FFFF)
- Validates against overlong encodings, invalid surrogates, and out-of-range values
-
JSON Escaping: Enhanced Unicode support
jsonEscape()- Added optionalescapeNonAsciiparameter (default: false)- When enabled, converts UTF-8 characters to
\uXXXXJSON escape sequences jsonUnescape()- Now properly handles UTF-16 surrogate pairs for emoji and supplementary characters
-
XML Escaping: Enhanced Unicode support
xmlEscape()- Added optionalescapeNonAsciiparameter (default: false)- When enabled, converts UTF-8 characters to
&#xHHHH;numeric character references - Generates uppercase hexadecimal encoding (e.g.,
€for €)
- Replaced anonymous namespaces with
detailnamespace for internal helper functions
- Character Classification: Additional numeric base validation and conversion utilities
isOctal()- Check if character is octal digit (0-7)octalToInt()- Convert octal character to integer valuedigitToInt()- Convert decimal digit character to integer valuehexToInt()- Convert hexadecimal character to integer value
- Internal Code Quality: Reduced code duplication through private helper functions
- Refactored
fromString()numeric parsing to use sharedparseNumericImpl()template helper - Refactored padding functions (
padLeft,padRight,center) to use sharedcreatePaddedString()helper - Improved loop index management in escape/unescape functions
- Refactored
- URL Decoding: Improved validation logic for percent-encoded sequences
- IPv4 Validation: Enhanced address parsing and boundary checking
- Case-Insensitive Natural Comparison:
inaturalCompare()- Case-insensitive natural comparison with embedded number handling (three-way comparison returning int)inaturalSort()- Case-insensitive natural sort predicate (returns bool, wrapper aroundinaturalCompare() < 0)
naturalSort()- Now implemented as a wrapper aroundnaturalCompare() < 0
- String Operations: Additional overloads for improved API convenience
startsWith()- Added overloads acceptingcharandconst char*parametersendsWith()- Added overloads acceptingcharandconst char*parameterscontains()- Added overloads acceptingcharandconst char*parametersindexOf()- Added overload acceptingcharparameterlastIndexOf()- Added overload acceptingcharparameter
- Case-Insensitive String Operations: New functions for case-insensitive comparisons
istartsWith()- Case-insensitive prefix checking withstring_view,char, andconst char*overloadsiendsWith()- Case-insensitive suffix checking withstring_view,char, andconst char*overloadsicontains()- Case-insensitive substring search withstring_view,char, andconst char*overloads- All functions perform ASCII case-insensitive comparisons for protocol detection, file extensions, HTTP headers, etc.
- Substring Extraction: Character delimiter support for zero-allocation operations
substringBefore()- Added overload acceptingchardelimitersubstringAfter()- Added overload acceptingchardelimitersubstringBeforeLast()- Added overload acceptingchardelimitersubstringAfterLast()- Added overload acceptingchardelimiter
-
Character Classification: Additional character validation utilities
isHexDigit()- Check if character is hexadecimal digit (0-9, a-f, A-F) -constexprandnoexcept
-
Internationalization Support: IDN (Internationalized Domain Names) validation
isIdnHostname()- Validate hostnames with Unicode characters or Punycode encoding (xn--)isIdnEmail()- Validate email addresses with Unicode in local-part or domain (EAI/SMTPUTF8)
-
IRI Support: Internationalized Resource Identifier validation (RFC 3987)
isIri()- Validate IRI format with Unicode characters (e.g., "https://example.com/路径", "http://例え.jp/テスト")isIriReference()- Validate IRI or relative IRI-reference with Unicode support (e.g., "/路径/to/resource", "../über/münchen")- Supports Unicode in paths, queries, and fragments while maintaining strict scheme validation
- Rejects control characters (null bytes, newlines, carriage returns) for security
-
URI Template Support: URI Template validation (RFC 6570)
isUriTemplate()- Validate URI Template format with variable expansion syntax- Supports simple variables (
{id}), reserved expansion ({+path}), query parameters ({?q,page}) - Validates operators (+ # . / ; ? &), modifiers (explode
*, prefix:max), and variable names - Comprehensive validation: rejects malformed expressions, invalid operators, and control characters
-
BREAKING: Standardized acronym capitalization in function names (camelCase convention)
- URI functions:
isURIReserved()→isUriReserved(),isURIUnreserved()→isUriUnreserved(),isURI()→isUri(),isURIReference()→isUriReference() - IP functions:
isIPv4Address()→isIpv4Address(),isIPv6Address()→isIpv6Address() - UUID:
isUUID()→isUuid() - JSON Pointer:
isJSONPointer()→isJsonPointer(),isRelativeJSONPointer()→isRelativeJsonPointer()
- URI functions:
-
BREAKING: Renamed validation functions for clarity and consistency
isValidHostname()→isHostname()isValidIdnHostname()→isIdnHostname()isValidPort()→isPortNumber()
isTime()- Corrected leap second validation (now accepts 00-60, was accepting 61+)isRelativeJsonPointer()- Fixed validation to accept bare non-negative integers (e.g., "0", "42")
- Format Validation: Constexpr RFC-compliant validators (~54x faster than regex)
isDate(),isTime(),isDateTime()- RFC 3339 date/time validationisDuration()- ISO 8601 duration format (P1Y2M3DT4H5M6S, P1W)isEmail()- RFC 5321 email validationisUUID()- RFC 4122 UUID format (8-4-4-4-12)isURI(),isURIReference()- RFC 3986 URI validationisJSONPointer(),isRelativeJSONPointer()- RFC 6901 JSON Pointer
- Consolidated packaging tool detection in CMake configuration
- Removed incorrect runtime dependencies from DEB/RPM packages
-
String Joining & Splitting: Collection and sequence operations
join()- Join container elements or iterator range with delimiterStringSplitter- Zero-allocation string splitting with iterator interfacesplitView()- Factory function for convenient splitting- Supports any string-like type (std::string, const char*, etc.)
- Range-based for loop support
-
Character Classification: ASCII character validation utilities
isWhitespace()- Check if character is whitespace (space, tab, newline, etc.)isDigit()- Check if character is a decimal digit (0-9)isAlpha()- Check if character is alphabetic (a-z, A-Z)isAlphaNumeric()- Check if character is alphanumeric- All functions are
constexprandnoexceptfor compile-time evaluation
-
String Validation: String content validation and testing
isEmpty()- Check if string is emptyisNullOrWhiteSpace()- Check if string is null, empty, or contains only whitespaceisAllDigits()- Check if string contains only digitshasExactLength()- Check if string has exact length- All functions use
std::string_viewfor zero-copy operations
-
Case Conversion: Character and string case manipulation
toLower()- Convert character or string to lowercasetoUpper()- Convert character or string to uppercase- Character functions are
constexprandnoexcept - String functions support ASCII characters only
-
String Comparison: Advanced comparison operations
equals()- Case-sensitive string equality comparisoniequals()- Case-insensitive string equality comparisoncompareIgnoreCase()- Three-way case-insensitive comparison (-1/0/+1)naturalCompare()- Natural sorting with embedded number handling (e.g., "file2.txt" < "file10.txt")commonPrefix()- Find longest common prefix between two strings (returnsstring_view)commonSuffix()- Find longest common suffix between two strings (returnsstring_view)startsWith()- Check if string starts with prefixendsWith()- Check if string ends with suffixcontains()- Check if string contains substringcount()- Count non-overlapping occurrences of substring or charactercountOverlapping()- Count all occurrences of substring including overlapping matches
-
String Trimming: Whitespace removal utilities
trim()- Remove leading and trailing whitespace (returnsstring_view, zero-copy)trimStart()- Remove leading whitespace (returnsstring_view, zero-copy)trimEnd()- Remove trailing whitespace (returnsstring_view, zero-copy)- All functions are
constexprandnoexceptfor zero-overhead abstraction
-
Predicate-Based Operations: Generic string operations with custom predicates
trimIf()- Remove leading/trailing characters matching predicatetrimStartIf()- Remove leading characters matching predicatetrimEndIf()- Remove trailing characters matching predicatecountIf()- Count characters matching predicatefindIf()- Find first character matching predicatefindIfNot()- Find first character NOT matching predicatereplaceIf()- Replace characters matching predicateremoveIf()- Remove characters matching predicate- All predicate functions accept lambda or function pointer accepting
charand returningbool
-
String Manipulation: String transformation and modification
replace()- Replace first occurrence of substringreplaceAll()- Replace all non-overlapping occurrences of substringreplaceIf()- Replace characters matching predicate with replacement characterremoveAll()- Remove all occurrences of character or substringremoveIf()- Remove characters matching predicateremoveWhitespace()- Remove all whitespace characterscollapseWhitespace()- Collapse consecutive whitespace to single spacepadLeft()- Pad string to specified length (right-aligned)padRight()- Pad string to specified length (left-aligned)center()- Center string within specified widthrepeat()- Repeat string specified number of timesreverse()- Reverse string content
-
Substring Extraction: Zero-copy substring operations
substringBefore()- Extract portion before first occurrence of delimitersubstringAfter()- Extract portion after first occurrence of delimitersubstringBeforeLast()- Extract portion before last occurrence of delimitersubstringAfterLast()- Extract portion after last occurrence of delimiterextractBetween()- Extract substring between start and end delimitersremovePrefix()- Remove prefix from string if presentremoveSuffix()- Remove suffix from string if presentindexOf()- Find first occurrence of substringlastIndexOf()- Find last occurrence of substring- All functions return
string_view(non-owning views into original string data)
-
Unified Parsing API: String to type conversion with validation
fromString<T>()- Unified parsing API supporting two interfaces:- Output parameter:
bool fromString(string_view, T& result)- zero-overhead for performance-critical code - Optional return:
std::optional<T> fromString(string_view)- modern C++ interface
- Output parameter:
- Supported types:
bool,int,uint32_t,int64_t,uint64_t,float,double - Boolean parsing supports: "true"/"false", "1"/"0", "yes"/"no", "on"/"off", "t"/"f", "y"/"n" (case-insensitive)
- Numeric parsing uses
std::from_charsfor optimal performance (matches stdlib at ~15ns for int) - Proper overflow and underflow detection via
std::errc
-
Text Formatting: String formatting and layout utilities
truncate()- Truncate string to maximum length (with optional ellipsis)wordWrap()- Word wrap text to specified widthindent()- Add indentation to each linededent()- Remove common leading whitespace from all lines
-
URI Character Classification: RFC 3986 compliant URI utilities
isURIReserved()- Check if character is URI reserved (:/?#[]@!$&'()*+,;=)isURIUnreserved()- Check if character is URI unreserved (alphanumeric +-._~)- All functions are
constexprandnoexcept
-
String Encoding: URL, JSON, XML, and C++ string encoding/decoding
urlEncode()- Encode string for URL (percent-encoding per RFC 3986)urlDecode()- Decode URL-encoded stringjsonEscape()- Escape string for JSON (handles quotes, backslashes, control characters, Unicode)jsonUnescape()- Unescape JSON string (supports Unicode escapes)xmlEscape()- Escape string for XML (handles special characters)xmlUnescape()- Unescape XML entitiescppEscape()- Escape string for C++ literals (newline, tab, backslash, quotes)cppUnescape()- Unescape C++ escape sequences
-
Network Validation: RFC-compliant network address validation
isIPv4Address()- IPv4 address validation (RFC 791)- Validates dotted-decimal notation (e.g., "192.168.1.1")
- Rejects leading zeros (e.g., "192.168.01.1" is invalid)
- Range validation for each octet (0-255)
isIPv6Address()- IPv6 address validation (RFC 4291/5952)- Supports full notation (e.g., "2001:0db8:85a3:0000:0000:8a2e:0370:7334")
- Supports compressed notation (e.g., "2001:db8::1")
- Supports IPv4-mapped addresses (e.g., "::ffff:192.0.2.1")
- Validates hexadecimal format and segment count
isValidHostname()- Hostname validation (RFC 1123)- Maximum 253 characters total length
- Labels (segments) max 63 characters each
- Labels must start/end with alphanumeric
- Labels can contain hyphens in the middle
isDomainName()- Domain name validation (RFC 1035)- Requires fully qualified domain name format
- At least one dot separator required
- Follows same rules as hostname validation
isValidPort()- Port number validation (RFC 6335)- Validates port range (0-65535)
- Compile-time type safety with templates
- Supports string and numeric input
-
Endpoint Parsing: Network endpoint parsing utilities
tryParseEndpoint()- Parse host:port combinations- Supports IPv4:port format (e.g., "192.168.1.1:8080")
- Supports hostname:port format (e.g., "example.com:443")
- Supports [IPv6]:port format (e.g., "[2001:db8::1]:8080")
- Uses output parameters:
bool tryParseEndpoint(endpoint, host, port) - Returns
trueon success,falseon parse error
-
Documentation
- README with feature overview
- Detailed API documentation with Doxygen comments
- Sample applications demonstrating library usage
Sample_Network- Network & URI validation examplesSample_StringSplitter- Zero-copy string splitting examplesSample_StringBasics- Validation, parsing, case conversionSample_StringOperations- Replacement, joining, paddingSample_StringPredicates- Custom predicates and filteringSample_StringEncoding- URL/JSON/XML/C++ encodingSample_StringFormatting- Truncation, wrapping, indentationSample_StringComparison- Advanced comparison operations
- Build and installation instructions
-
Testing & Benchmarking
- Unit test suite
- Performance benchmarks for all operations
- Cross-compiler performance validation