src/str.h

Fri, 10 Jan 2014 21:58:42 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Fri, 10 Jan 2014 21:58:42 +0200
changeset 72
03e4d9db3fd9
parent 71
11f23fabf8a6
child 73
1ee9b312dc18
permissions
-rw-r--r--

- major refactoring begins

#ifndef STRING_H
#define STRING_H

#include <deque>
#include <string>
#include <stdarg.h>
#include "types.h"
#include "containers.h"

class string;
class string_list;

// =============================================================================
//
class string
{
	public:
		typedef typename ::std::string::iterator       iterator;
		typedef typename ::std::string::const_iterator const_iterator;
		using length_type = int;

		string() {}

		string (char a)
		{
			m_string = &a;
		}

		string (const char* data)
		{
			m_string = data;
		}

		string (std::string data)
		{
			m_string = data;
		}

		void               dump() const;
		int                compare (const string& other) const;
		bool               ends_with (const string& other);
		int                count (const char needle) const;
		int                first (const char* c, length_type a = 0) const;
		int                last (const char* c, length_type a = -1) const;
		string             to_lowercase() const;
		bool               is_numeric() const;
		bool				mask (const string& pattern) const;
		length_type        posof (int n) const;
		void               prepend (string a);
		void               replace (const char* a, const char* b);
		string_list        split (string del) const;
		string_list        split (char del) const;
		void               sprintf (const char* fmtstr, ...);
		bool               starts_with (const string& other);
		string             strip (list< char > unwanted);
		string             substring (long a, long b = -1) const;
		double             to_double (bool* ok = null) const;
		float              to_float (bool* ok = null) const;
		long               to_long (bool* ok = null, int base = 10) const;
		void               trim (length_type n);
		string             to_uppercase() const;

		string             operator+ (const string data) const;
		string             operator+ (const char* data) const;
		string&            operator+= (const string data);
		string&            operator+= (const char* data);

		inline bool is_empty() const
		{
			return m_string[0] == '\0';
		}

		inline void append (const char* data)
		{
			m_string.append (data);
		}

		inline void append (const char data)
		{
			m_string.push_back (data);
		}

		inline void append (const string& data)
		{
			m_string.append (data.chars());
		}

		inline iterator begin()
		{
			return m_string.begin();
		}

		inline const_iterator begin() const
		{
			return m_string.cbegin();
		}

		inline int capacity() const
		{
			return m_string.capacity();
		}

		inline const char* chars() const
		{
			return m_string.c_str();
		}

		inline const char* c_str() const
		{
			return m_string.c_str();
		}

		inline iterator end()
		{
			return m_string.end();
		}

		inline const_iterator end() const
		{
			return m_string.end();
		}

		inline void clear()
		{
			m_string.clear();
		}

		inline bool empty() const
		{
			return m_string.empty();
		}

		inline void erase (length_type pos)
		{
			m_string.erase (m_string.begin() + pos);
		}

		inline void insert (length_type pos, char c)
		{
			m_string.insert (m_string.begin() + pos, c);
		}

		inline length_type len() const
		{
			return length();
		}

		inline length_type length() const
		{
			return m_string.length();
		}

		inline int max_size() const
		{
			return m_string.max_size();
		}

		inline string mid (int a, int len) const
		{
			return m_string.substr (a, len);
		}

		inline void remove (int pos, int len)
		{
			m_string.replace (pos, len, "");
		}

		inline void remove_from_start (int len)
		{
			remove (0, len);
		}

		inline void remove_from_end (int len)
		{
			remove (length() - len, len);
		}

		inline void resize (int n)
		{
			m_string.resize (n);
		}

		inline void replace (int pos, int n, const string& a)
		{
			m_string.replace (pos, n, a.chars());
		}

		inline void shrink_to_fit()
		{
			m_string.shrink_to_fit();
		}

		inline const std::string& std_string() const
		{
			return m_string;
		}

		inline string strip (char unwanted)
		{
			return strip ( {unwanted});
		}

		string& operator+= (const char data)
		{
			append (data);
			return *this;
		}

		string operator- (int n) const
		{
			string new_string = m_string;
			new_string -= n;
			return new_string;
		}

		inline string& operator-= (int n)
		{
			trim (n);
			return *this;
		}

		inline string operator+() const
		{
			return to_uppercase();
		}

		inline string operator-() const
		{
			return to_lowercase();
		}

		inline bool operator== (const string& other) const
		{
			return std_string() == other.std_string();
		}

		inline bool operator== (const char* other) const
		{
			return operator== (string (other));
		}

		inline bool operator!= (const string& other) const
		{
			return std_string() != other.std_string();
		}

		inline bool operator!= (const char* other) const
		{
			return operator!= (string (other));
		}

		inline bool operator> (const string& other) const
		{
			return std_string() > other.std_string();
		}

		inline bool operator< (const string& other) const
		{
			return std_string() < other.std_string();
		}

		inline operator const char*() const
		{
			return chars();
		}

		inline operator const std::string&() const
		{
			return std_string();
		}

		// Difference between indices @a and @b. @b can be -1, in which
		// case it will be length() - 1.
		inline int index_difference (int a, int b)
		{
			assert (b == -1 || b >= a);
			return (b != -1 ? b - a : length() - 1 - a);
		}

	private:
		std::string m_string;
};

// =============================================================================
//
class string_list : public list<string>
{
	public:
		string_list() {}
		string_list (std::initializer_list<string> vals) :
			list<string> (vals) {}
		string_list (const list<string>& a) : list<string> (a.std_deque()) {}
		string_list (const list_type& a) : list<string> (a) {}

		string join (const string& delim);
};

bool operator== (const char* a, const string& b);
string operator+ (const char* a, const string& b);

#endif // STRING_H

mercurial