BaseString.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef __UTIL_BASESTRING_HPP_INCLUDED__
  14. #define __UTIL_BASESTRING_HPP_INCLUDED__
  15. #include <ndb_global.h>
  16. #include <Vector.hpp>
  17. /**
  18.  * @class BaseString
  19.  * @brief Null terminated strings
  20.  */
  21. class BaseString {
  22. public:
  23.   /** @brief Constructs an empty string */
  24.   BaseString();
  25.   /** @brief Constructs a copy of a char * */
  26.   BaseString(const char* s);
  27.   /** @brief Constructs a copy of another BaseString */
  28.   BaseString(const BaseString& str);
  29.   /** @brief Destructor */
  30.   ~BaseString();
  31.   /** @brief Returns a C-style string */
  32.   const char* c_str() const;
  33.   /** @brief Returns the length of the string */
  34.   unsigned length() const;
  35.   /** @brief Checks if the string is empty */
  36.   bool empty() const;
  37.   /** @brief Convert to uppercase */
  38.   BaseString& ndb_toupper();
  39.   /** @brief Convert to lowercase */
  40.   BaseString& ndb_tolower();
  41.   /** @brief Assigns from a char * */
  42.   BaseString& assign(const char* s);
  43.   /** @brief Assigns from another BaseString */
  44.   BaseString& assign(const BaseString& str);
  45.   /** @brief Assigns from char *s, with maximum length n */
  46.   BaseString& assign(const char* s, size_t n);
  47.   /** @brief Assigns from another BaseString, with maximum length n */
  48.   BaseString& assign(const BaseString& str, size_t n);
  49.   /** 
  50.    * Assings from a Vector of BaseStrings, each Vector entry
  51.    * separated by separator.
  52.    *
  53.    * @param vector Vector of BaseStrings to append
  54.    * @param separator Separation between appended strings
  55.    */
  56.   BaseString& assign(const Vector<BaseString> &vector,
  57.      const BaseString &separator = BaseString(" "));
  58.   /** @brief Appends a char * to the end */
  59.   BaseString& append(const char* s);
  60.   /** @brief Appends a char to the end */
  61.   BaseString& append(char c);
  62.   /** @brief Appends another BaseString to the end */
  63.   BaseString& append(const BaseString& str);
  64.   /** 
  65.    * Appends a Vector of BaseStrings to the end, each Vector entry
  66.    * separated by separator.
  67.    *
  68.    * @param vector Vector of BaseStrings to append
  69.    * @param separator Separation between appended strings
  70.    */
  71.   BaseString& append(const Vector<BaseString> &vector,
  72.      const BaseString &separator = BaseString(" "));
  73.   /** @brief Assigns from a format string a la printf() */
  74.   BaseString& assfmt(const char* ftm, ...);
  75.   /** @brief Appends a format string a la printf() to the end */
  76.   BaseString& appfmt(const char* ftm, ...);
  77.   /**
  78.    * Split a string into a vector of strings. Separate the string where
  79.    * any character included in separator exists.
  80.    * Maximally maxSize entries are added to the vector, if more separators
  81.    * exist in the string, the remainder of the string will be appended
  82.    * to the last entry in the vector.
  83.    * The vector will not be cleared, so any existing strings in the
  84.    * vector will remain.
  85.    *
  86.    * @param separator characters separating the entries
  87.    * @param vector where the separated strings will be stored
  88.    * @param maximum number of strings extracted
  89.    *
  90.    * @returns the number of string added to the vector
  91.    */
  92.   int split(Vector<BaseString> &vector, 
  93.     const BaseString &separator = BaseString(" "),
  94.     int maxSize = -1) const;
  95.   /**
  96.    * Returns the index of the first occurance of the character c.
  97.    *
  98.    * @params c character to look for
  99.    * @returns index of character, of -1 if no character found
  100.    */
  101.   ssize_t indexOf(char c);
  102.   /**
  103.    * Returns the index of the last occurance of the character c.
  104.    *
  105.    * @params c character to look for
  106.    * @returns index of character, of -1 if no character found
  107.    */
  108.   ssize_t lastIndexOf(char c);
  109.   
  110.   /**
  111.    * Returns a subset of a string
  112.    *
  113.    * @param start index of first character
  114.    * @param stop index of last character
  115.    * @return a new string
  116.    */
  117.   BaseString substr(ssize_t start, ssize_t stop = -1);
  118.   /**
  119.    *  @brief Assignment operator
  120.    */
  121.   BaseString& operator=(const BaseString& str);
  122.   /** @brief Compare two strings */
  123.   bool operator<(const BaseString& str) const;
  124.   /** @brief Are two strings equal? */
  125.   bool operator==(const BaseString& str) const;
  126.   /** @brief Are two strings equal? */
  127.   bool operator==(const char *str) const;
  128.   /** @brief Are two strings not equal? */
  129.   bool operator!=(const BaseString& str) const;
  130.   /** @brief Are two strings not equal? */
  131.   bool operator!=(const char *str) const;
  132.   /**
  133.    * Trim string from <i>delim</i>
  134.    */
  135.   BaseString& trim(const char * delim = " t");
  136.   
  137.   /**
  138.    * Return c-array with strings suitable for execve
  139.    * When whitespace is detected, the characters '"' and '' are honored,
  140.    * to make it possible to give arguments containing whitespace.
  141.    * The semantics of '"' and '' match that of most Unix shells.
  142.    */
  143.   static char** argify(const char *argv0, const char *src);
  144.   /**
  145.    * Trim string from <i>delim</i>
  146.    */
  147.   static char* trim(char * src, const char * delim);
  148.   /**
  149.    * snprintf on some platforms need special treatment
  150.    */
  151.   static int snprintf(char *str, size_t size, const char *format, ...);
  152.   static int vsnprintf(char *str, size_t size, const char *format, va_list ap);
  153. private:
  154.   char* m_chr;
  155.   unsigned m_len;
  156. };
  157. inline const char*
  158. BaseString::c_str() const
  159. {
  160.   return m_chr;
  161. }
  162. inline unsigned
  163. BaseString::length() const
  164. {
  165.   return m_len;
  166. }
  167. inline bool
  168. BaseString::empty() const
  169. {
  170.   return m_len == 0;
  171. }
  172. inline BaseString&
  173. BaseString::ndb_toupper() {
  174.   for(unsigned i = 0; i < length(); i++)
  175.     m_chr[i] = toupper(m_chr[i]);
  176.   return *this;
  177. }
  178. inline BaseString&
  179. BaseString::ndb_tolower() {
  180.   for(unsigned i = 0; i < length(); i++)
  181.     m_chr[i] = tolower(m_chr[i]);
  182.   return *this;
  183. }
  184. inline bool
  185. BaseString::operator<(const BaseString& str) const
  186. {
  187.     return strcmp(m_chr, str.m_chr) < 0;
  188. }
  189. inline bool
  190. BaseString::operator==(const BaseString& str) const
  191. {
  192.     return strcmp(m_chr, str.m_chr)  ==  0;
  193. }
  194. inline bool
  195. BaseString::operator==(const char *str) const
  196. {
  197.     return strcmp(m_chr, str) == 0;
  198. }
  199. inline bool
  200. BaseString::operator!=(const BaseString& str) const
  201. {
  202.     return strcmp(m_chr, str.m_chr)  !=  0;
  203. }
  204. inline bool
  205. BaseString::operator!=(const char *str) const
  206. {
  207.     return strcmp(m_chr, str) != 0;
  208. }
  209. inline BaseString&
  210. BaseString::assign(const BaseString& str)
  211. {
  212.     return assign(str.m_chr);
  213. }
  214. inline BaseString&
  215. BaseString::assign(const Vector<BaseString> &vector,
  216.    const BaseString &separator) {
  217.   assign("");
  218.   return append(vector, separator);
  219. }
  220. #endif /* !__UTIL_BASESTRING_HPP_INCLUDED__ */