diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/pfc/string-lite.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,145 @@
+#pragma once
+
+#include "string-interface.h"
+#include "mem_block.h"
+#include "string-compare.h"
+
+namespace pfc {
+
+	typedef const char* stringp;
+	inline size_t stringp_length(stringp s) noexcept { return strlen(s); }
+
+	class stringLite : public string_base {
+	public:
+		struct tagNoShrink {};
+		struct tagPrealloc { size_t amount; };
+		stringLite(tagNoShrink) { this->setNoShrink(); }
+		stringLite(tagPrealloc const& tag) { this->prealloc(tag.amount); }
+		stringLite() {}
+		stringLite( const stringLite & other ) { copy(other); }
+		stringLite( stringLite && other ) noexcept { move(other); }
+		stringLite( const char * p, size_t len = SIZE_MAX ) { set_string( p, len ); }
+		stringLite( string_part_ref const & );
+		stringLite( string_base const& );
+
+		stringLite const & operator=( const stringLite & other ) { copy(other); return *this; }
+		stringLite const & operator=( stringLite && other ) noexcept { move(other); return *this; }
+		stringLite const & operator=( const char * p ) { set_string( p ); return *this; }
+		stringLite const & operator=( const string_part_ref & );
+		stringLite const & operator=( const string_base & );
+
+		const char * get_ptr() const { return m_ptr; }
+		operator const char*() const { return m_ptr; }
+		const char* c_str() const { return m_ptr; }
+		const char* ptr() const { return m_ptr; }
+		void add_string(const char * p_string,t_size p_string_size = SIZE_MAX);
+		void set_string(const char * p_string,t_size p_length = SIZE_MAX);
+		void add_string_nc( const char * ptr, size_t length );
+		void set_string_nc( const char * ptr, size_t length );
+		void truncate(t_size len);
+		t_size get_length() const { return m_length; }
+		char * lock_buffer(t_size p_requested_length);
+		void unlock_buffer();
+		void set_char(size_t offset,char c);
+		void prealloc(size_t);
+		void setNoShrink(bool v = true) { m_noShrink = v; }
+
+		size_t replace_nontext_chars(char p_replace = '_');
+		size_t replace_char(unsigned c1,unsigned c2);
+		size_t replace_byte(char c1,char c2);
+		void remove_chars(t_size first,t_size count);
+		void insert_chars(t_size first,const char * src, t_size count);
+		void insert_chars_nc(t_size first,const char * src, t_size count);
+		void insert_chars(t_size first,const char * src);
+
+		bool operator==(const stringLite& other) const noexcept;
+		bool operator!=(const stringLite& other) const noexcept;
+		bool operator==(const char* other) const noexcept;
+		bool operator!=(const char* other) const noexcept;
+		bool operator>(const stringLite& other) const noexcept;
+		bool operator<(const stringLite& other) const noexcept;
+		bool operator>(const char* other) const noexcept;
+		bool operator<(const char* other) const noexcept;
+		bool operator>=(const stringLite& other) const noexcept;
+		bool operator<=(const stringLite& other) const noexcept;
+		bool operator>=(const char* other) const noexcept;
+		bool operator<=(const char* other) const noexcept;
+
+
+		stringLite const& operator+=(const stringLite& other) { add_string(other.c_str(), other.length()); return *this; }
+		stringLite const& operator+=(const char* other) { add_string(other); return *this; }
+		stringLite const& operator+=(string_part_ref other) { add_string_nc(other.m_ptr, other.m_len); return *this; }
+
+		stringLite operator+(const stringLite& other) const {stringLite ret = *this; ret += other; return ret;}
+		stringLite operator+(const char * other) const { stringLite ret = *this; ret += other; return ret; }
+		stringLite operator+(string_part_ref other) const { stringLite ret = *this; ret += other; return ret; }
+
+		bool equals(const stringLite& other) const noexcept;
+		bool equals(const char* other) const noexcept;
+		static bool equals( const stringLite & v1, const stringLite & v2 ) noexcept;
+		static bool greater( const stringLite & v1, const stringLite & v2 ) noexcept;
+		static bool greater( const char * v1, size_t s1, const char * v2, size_t s2) noexcept;
+
+		void clear() noexcept;
+		void copy( stringLite const & other );
+		void move( stringLite & other ) noexcept;
+
+		stringLite lowerCase() const;
+		stringLite upperCase() const;
+		stringLite toLower() const { return lowerCase(); }
+		stringLite toUpper() const { return upperCase(); }
+
+		typedef stringComparatorCaseSensitive comparatorCaseSensitive;
+		typedef stringComparatorCaseInsensitive comparatorCaseInsensitive;
+		typedef stringComparatorCaseInsensitiveASCII comparatorCaseInsensitiveASCII;
+
+		static bool g_equals(const stringLite& p_item1, const stringLite& p_item2) { return p_item1 == p_item2; }
+		static bool g_equalsCaseInsensitive(const stringLite& p_item1, const stringLite& p_item2) { return comparatorCaseInsensitive::compare(p_item1, p_item2) == 0; }
+
+		stringLite subString(t_size base) const;
+		stringLite subString(t_size base, t_size count) const;
+		static bool isNonTextChar(char c) { return c >= 0 && c < 32; }
+
+		//! @returns SIZE_MAX if not found.
+		size_t indexOf(char c, t_size base = 0) const;
+		//! @returns SIZE_MAX if not found.
+		size_t lastIndexOf(char c, size_t base = SIZE_MAX) const;
+		//! @returns SIZE_MAX if not found.
+		size_t indexOf(stringp s, size_t base = 0) const;
+		//! @returns SIZE_MAX if not found.
+		size_t lastIndexOf(stringp s, size_t base = SIZE_MAX) const;
+		//! @returns SIZE_MAX if not found.
+		size_t indexOfAnyChar(stringp s, size_t base = 0) const;
+		//! @returns SIZE_MAX if not found.
+		size_t lastIndexOfAnyChar(stringp s, size_t base = SIZE_MAX) const;
+
+		bool contains(char c) const;
+		bool contains(stringp s) const;
+
+		bool containsAnyChar(stringp s) const;
+
+		bool startsWith(char c) const;
+		bool startsWith(stringp s) const;
+		bool endsWith(char c) const;
+		bool endsWith(stringp s) const;
+
+		char firstChar() const;
+		char lastChar() const;
+
+		bool isEmpty() const { return empty(); }
+		bool empty() const { return length() == 0;}
+		
+		stringLite replace(stringp strOld, stringp strNew) const;
+		stringLite trim(char c) const;
+	private:
+		void _clear() noexcept;
+		void makeRoom( size_t size );
+		const char * m_ptr = "";
+		size_t m_length = 0;
+		mem_block m_mem;
+		bool m_noShrink = false;
+	};
+
+	typedef stringLite string8;
+	typedef stringLite string_formatter;
+}