sources/mystring.h

Mon, 04 May 2015 18:16:05 +0300

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Mon, 04 May 2015 18:16:05 +0300
changeset 70
0e947b487b18
parent 69
eb4c25284a19
child 73
07dda51a7a8e
permissions
-rw-r--r--

Yay colors

/*
	Copyright 2014 Teemu Piippo
	All rights reserved.

	Redistribution and use in source and binary forms, with or without
	modification, are permitted provided that the following conditions
	are met:

	1. Redistributions of source code must retain the above copyright
	   notice, this list of conditions and the following disclaimer.
	2. Redistributions in binary form must reproduce the above copyright
	   notice, this list of conditions and the following disclaimer in the
	   documentation and/or other materials provided with the distribution.
	3. Neither the name of the copyright holder nor the names of its
	   contributors may be used to endorse or promote products derived from
	   this software without specific prior written permission.

	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
	"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
	TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
	PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
	OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
	EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
	PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
	PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
	LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
	NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
	SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#pragma once
#include <deque>
#include <string>
#include <stdarg.h>
#include "basics.h"
#include "list.h"

class String;
class StringList;

// -------------------------------------------------------------------------------------------------
//
class String
{
public:
	String() {}

	explicit String (char a) :
		m_string ({ a, '\0' }) {}

	String (const char* data) :
		m_string (data) {}

	String (const std::string& data) :
		m_string (data) {}

	String (const Vector<char>& data) :
		m_string (data.data(), data.size()) {}

	using Iterator = std::string::iterator;
	using ConstIterator = std::string::const_iterator;

	ConstIterator begin() const { return m_string.cbegin(); }
	int compare (const String &other) const;
	int count (char needle) const;
	const char* chars() const { return m_string.c_str(); }
	ConstIterator end() const { return m_string.end(); }
	int find (const char*c, int a = 0) const;
	bool is_empty() const { return m_string[0] == '\0'; }
	bool is_numeric() const;
	int find_last (const char*c, int a) const;
	int length() const { return m_string.length(); }
	bool mask_against (const String &pattern) const;
	String md5() const;
	String mid (long a, long b) const;
	StringList split (const String &del) const;
	StringList split (char del) const;
	const std::string& std_string() const { return m_string; }
	double to_double (bool* ok = nullptr) const;
	float to_float (bool* ok = nullptr) const;
	long to_int (bool* ok = nullptr, int base = 10) const;
	String to_lowercase() const;
	String to_uppercase() const;
	int word_position (int n) const;

	void append (const char* data) { m_string.append (data); }
	void append (char data) { m_string.push_back (data); }
	void append (const String& data) { m_string.append (data.chars()); }
	Iterator begin() { return m_string.begin(); }
	void clear() { m_string.clear(); }
	Iterator end() { return m_string.end(); }
	bool ends_with (const String &other);
	int index_difference (int a, int b) { modify_index (a); modify_index (b); return b - a; }
	void insert (int pos, char c) { m_string.insert (m_string.begin() + pos, c); }
	void insert (int pos, const char*c) { m_string.insert (pos, c); }
	void modify_index (int &a) { if (a < 0) { a = length() - a; } }
	void normalize (int (*filter)(int) = &std::isspace);
	void prepend (String a) { m_string = (a + m_string).std_string(); }
	void remove (int pos, int len) { m_string.replace (pos, len, ""); }
	void remove_at (int pos) { m_string.erase (m_string.begin() + pos); }
	void remove_from_end (int len) { remove (length() - len, len); }
	void remove_from_start (int len) { remove (0, len); }
	void replace (const char* a, const char* b);
	void replace (int pos, int n, const String &a) { m_string.replace (pos, n, a.chars()); }
	void shrink_to_fit() { m_string.shrink_to_fit(); }
	void sprintf (const char* fmtstr, ...);
	bool starts_with (const String &other);
	String strip (char unwanted) { return strip ({unwanted}); }
	String strip (const List<char> &unwanted);
	void trim (int n);

	static String from_number (short int a);
	static String from_number (int a);
	static String from_number (long int a);
	static String from_number (unsigned short int a);
	static String from_number (unsigned int a);
	static String from_number (unsigned long int a);
	static String from_number (double a);

	String operator+ (const String& data) const;
	String operator+ (const char* data) const;
	String operator+ (int num) const { return *this + String::from_number (num); }
	String& operator+= (const String& data) { append (data); return *this; }
	String& operator+= (const char* data) { append (data); return *this; }
	String& operator+= (int num) { return operator+= (String::from_number (num)); }
	String& operator+= (char data) { append (data); return *this; }
	bool operator== (const String& other) const { return std_string() == other.std_string(); }
	bool operator== (const char* other) const { return m_string == other; }
	bool operator!= (const String& other) const { return std_string() != other.std_string(); }
	bool operator!= (const char* other) const { return m_string != other; }
	bool operator> (const String& other) const { return std_string() > other.std_string(); }
	bool operator< (const String& other) const { return std_string() < other.std_string(); }
	bool operator>= (const String& other) const { return std_string() >= other.std_string(); }
	bool operator<= (const String& other) const { return std_string() <= other.std_string(); }
	operator const char*() const { return chars(); }
	operator const std::string&() const { return std_string(); }

private:
	std::string m_string;
};

// -------------------------------------------------------------------------------------------------
//
class StringList : public List<String>
{
public:
	using Super = List<String>;
	using Super::Super;

	StringList() {}

	StringList (const Super& other) :
		Super (other) {}

	String join (const String& delim);
};

// -------------------------------------------------------------------------------------------------
//
inline bool operator== (const char* a, const String& b)
{
	return b == a;
}

// -------------------------------------------------------------------------------------------------
//
inline String operator+ (const char* a, const String& b)
{
	return String (a) + b;
}

mercurial