--- a/src/str.h Sun Feb 02 01:50:23 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,329 +0,0 @@ -/* - Copyright 2012-2014 Santeri 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. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifndef BOTC_STRING_H -#define BOTC_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() {} - - explicit 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 = nullptr) const; - float to_float (bool* ok = nullptr) const; - long to_long (bool* ok = nullptr, 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+ (int num) const; - string& operator+= (const string data); - string& operator+= (const char* data); - string& operator+= (int num); - - static string from_number (int a); - static string from_number (long a); - - 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 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 // BOTC_STRING_H