annotate foosdk/sdk/pfc/string-lite.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "string-interface.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "mem_block.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "string-compare.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 typedef const char* stringp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 inline size_t stringp_length(stringp s) noexcept { return strlen(s); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 class stringLite : public string_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 struct tagNoShrink {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 struct tagPrealloc { size_t amount; };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 stringLite(tagNoShrink) { this->setNoShrink(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 stringLite(tagPrealloc const& tag) { this->prealloc(tag.amount); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 stringLite() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 stringLite( const stringLite & other ) { copy(other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 stringLite( stringLite && other ) noexcept { move(other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 stringLite( const char * p, size_t len = SIZE_MAX ) { set_string( p, len ); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 stringLite( string_part_ref const & );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 stringLite( string_base const& );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 stringLite const & operator=( const stringLite & other ) { copy(other); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 stringLite const & operator=( stringLite && other ) noexcept { move(other); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 stringLite const & operator=( const char * p ) { set_string( p ); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 stringLite const & operator=( const string_part_ref & );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 stringLite const & operator=( const string_base & );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 const char * get_ptr() const { return m_ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 operator const char*() const { return m_ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 const char* c_str() const { return m_ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 const char* ptr() const { return m_ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 void add_string(const char * p_string,t_size p_string_size = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 void set_string(const char * p_string,t_size p_length = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void add_string_nc( const char * ptr, size_t length );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 void set_string_nc( const char * ptr, size_t length );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void truncate(t_size len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 t_size get_length() const { return m_length; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 char * lock_buffer(t_size p_requested_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void unlock_buffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 void set_char(size_t offset,char c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 void prealloc(size_t);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 void setNoShrink(bool v = true) { m_noShrink = v; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 size_t replace_nontext_chars(char p_replace = '_');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 size_t replace_char(unsigned c1,unsigned c2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 size_t replace_byte(char c1,char c2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void remove_chars(t_size first,t_size count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 void insert_chars(t_size first,const char * src, t_size count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 void insert_chars_nc(t_size first,const char * src, t_size count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 void insert_chars(t_size first,const char * src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 bool operator==(const stringLite& other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 bool operator!=(const stringLite& other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 bool operator==(const char* other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 bool operator!=(const char* other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 bool operator>(const stringLite& other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 bool operator<(const stringLite& other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 bool operator>(const char* other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 bool operator<(const char* other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 bool operator>=(const stringLite& other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 bool operator<=(const stringLite& other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 bool operator>=(const char* other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 bool operator<=(const char* other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 stringLite const& operator+=(const stringLite& other) { add_string(other.c_str(), other.length()); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 stringLite const& operator+=(const char* other) { add_string(other); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 stringLite const& operator+=(string_part_ref other) { add_string_nc(other.m_ptr, other.m_len); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 stringLite operator+(const stringLite& other) const {stringLite ret = *this; ret += other; return ret;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 stringLite operator+(const char * other) const { stringLite ret = *this; ret += other; return ret; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 stringLite operator+(string_part_ref other) const { stringLite ret = *this; ret += other; return ret; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 bool equals(const stringLite& other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 bool equals(const char* other) const noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 static bool equals( const stringLite & v1, const stringLite & v2 ) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 static bool greater( const stringLite & v1, const stringLite & v2 ) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 static bool greater( const char * v1, size_t s1, const char * v2, size_t s2) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 void clear() noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 void copy( stringLite const & other );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 void move( stringLite & other ) noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 stringLite lowerCase() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 stringLite upperCase() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 stringLite toLower() const { return lowerCase(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 stringLite toUpper() const { return upperCase(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 typedef stringComparatorCaseSensitive comparatorCaseSensitive;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 typedef stringComparatorCaseInsensitive comparatorCaseInsensitive;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 typedef stringComparatorCaseInsensitiveASCII comparatorCaseInsensitiveASCII;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 static bool g_equals(const stringLite& p_item1, const stringLite& p_item2) { return p_item1 == p_item2; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 static bool g_equalsCaseInsensitive(const stringLite& p_item1, const stringLite& p_item2) { return comparatorCaseInsensitive::compare(p_item1, p_item2) == 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 stringLite subString(t_size base) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 stringLite subString(t_size base, t_size count) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 static bool isNonTextChar(char c) { return c >= 0 && c < 32; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 //! @returns SIZE_MAX if not found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 size_t indexOf(char c, t_size base = 0) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 //! @returns SIZE_MAX if not found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 size_t lastIndexOf(char c, size_t base = SIZE_MAX) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 //! @returns SIZE_MAX if not found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 size_t indexOf(stringp s, size_t base = 0) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 //! @returns SIZE_MAX if not found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 size_t lastIndexOf(stringp s, size_t base = SIZE_MAX) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 //! @returns SIZE_MAX if not found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 size_t indexOfAnyChar(stringp s, size_t base = 0) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 //! @returns SIZE_MAX if not found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 size_t lastIndexOfAnyChar(stringp s, size_t base = SIZE_MAX) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 bool contains(char c) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 bool contains(stringp s) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 bool containsAnyChar(stringp s) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 bool startsWith(char c) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 bool startsWith(stringp s) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 bool endsWith(char c) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 bool endsWith(stringp s) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 char firstChar() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 char lastChar() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 bool isEmpty() const { return empty(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 bool empty() const { return length() == 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 stringLite replace(stringp strOld, stringp strNew) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 stringLite trim(char c) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 void _clear() noexcept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 void makeRoom( size_t size );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 const char * m_ptr = "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 size_t m_length = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 mem_block m_mem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 bool m_noShrink = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 typedef stringLite string8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 typedef stringLite string_formatter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }