string_container.h

Go to the documentation of this file.
00001 /*
00002 **  ClanLib SDK
00003 **  Copyright (c) 1997-2009 The ClanLib Team
00004 **
00005 **  This software is provided 'as-is', without any express or implied
00006 **  warranty.  In no event will the authors be held liable for any damages
00007 **  arising from the use of this software.
00008 **
00009 **  Permission is granted to anyone to use this software for any purpose,
00010 **  including commercial applications, and to alter it and redistribute it
00011 **  freely, subject to the following restrictions:
00012 **
00013 **  1. The origin of this software must not be misrepresented; you must not
00014 **     claim that you wrote the original software. If you use this software
00015 **     in a product, an acknowledgment in the product documentation would be
00016 **     appreciated but is not required.
00017 **  2. Altered source versions must be plainly marked as such, and must not be
00018 **     misrepresented as being the original software.
00019 **  3. This notice may not be removed or altered from any source distribution.
00020 **
00021 **  Note: Some of the libraries ClanLib may link to may have additional
00022 **  requirements or restrictions.
00023 **
00024 **  File Author(s):
00025 **
00026 **    Magnus Norddahl
00027 **    Harry Storbacka
00028 */
00029 
00032 
00033 #ifndef _cl_header_string_container_
00034 #define _cl_header_string_container_
00035 
00036 #if defined(_MSC_VER)
00037 #pragma once
00038 #endif
00039 
00040 #include "../api_core.h"
00041 #include "string_data.h"
00042 
00043 class CL_MemoryPool;
00044 
00049 template<typename CharType, typename ReferenceClass, typename StdString>
00050 class CL_API_CORE CL_StringContainer : public CL_StringData<CharType, ReferenceClass, StdString>
00051 {
00052 public:
00053 
00054 #ifndef WIN32
00055 
00056         // Fix for GCC bug for not finding CL_StringDataTypes::size_type and so on .... grrrrrrr!
00057         // TODO: Remove this fix when GCC is a good compiler. As from 13 December 2007, SVN GCC does not work
00058         // See: http:/** gcc.gnu.org/bugzilla/show_bug.cgi?id=34453*/
00059         typedef unsigned int size_type;
00060         typedef CharType char_type;
00061         typedef CharType *iterator;
00062         typedef const CharType *const_iterator;
00063 
00064         // These could and maybe should be replaced with "this->function_name()"
00065         iterator begin() { return CL_StringData<CharType, ReferenceClass, StdString>::begin(); }
00066 
00070         iterator end() { return CL_StringData<CharType, ReferenceClass, StdString>::end(); }
00071 
00075         size_type size() const { return CL_StringData<CharType, ReferenceClass, StdString>::size(); }
00076 
00080         size_type length() const { return CL_StringData<CharType, ReferenceClass, StdString>::length(); }
00081 
00085         bool empty() const { return CL_StringData<CharType, ReferenceClass, StdString>::empty(); }
00086 
00090         const CharType *data() const { return CL_StringData<CharType, ReferenceClass, StdString>::data(); }
00091         CharType *data() { return CL_StringData<CharType, ReferenceClass, StdString>::data(); }
00092 
00093 #endif
00094 
00095         CL_StringContainer();
00096 
00100         CL_StringContainer(const StdString &source);
00101 
00105         CL_StringContainer(const CL_StringContainer &source);
00106 
00111         CL_StringContainer(const CL_StringData<CharType, ReferenceClass, StdString> &source);
00112 
00116         CL_StringContainer(const char *c_str);
00117 
00122         CL_StringContainer(const char *c_str, size_type length);
00123 
00127         CL_StringContainer(const wchar_t *wc_str);
00128 
00133         CL_StringContainer(const wchar_t *wc_str, size_type length);
00134 
00139         CL_StringContainer(size_type n, CharType c);
00140         ~CL_StringContainer();
00141 
00145         operator ReferenceClass() const;
00146 
00147         const CharType *c_str() const;
00148 
00152         size_type max_size() const { return (size_type) -1; }
00153 
00157         size_type capacity() const { return data_capacity; }
00158 
00159 //      void swap(CL_StringContainer &other);
00160 //      static inline swap(CL_StringContainer &s1, CL_StringContainer &s2);
00161 
00163         void clear();
00164 
00168         void reserve(size_type size);
00169 
00173         void resize(size_type n);
00174 
00179         void resize(size_type n, CharType c);
00180 
00181 //      template <class InputIterator>
00182 //      CL_StringContainer &assign(InputIterator first, InputIterator last);
00183         CL_StringContainer &assign(const CL_StringData<CharType, ReferenceClass, StdString> &s);
00184 
00193         CL_StringContainer &assign(const CL_StringData<CharType, ReferenceClass, StdString> &s, size_type pos, size_type n);
00194 
00201         CL_StringContainer &assign(const CharType *s, size_type n);
00202 
00208         CL_StringContainer &assign(const CharType *s);
00209 
00216         CL_StringContainer &assign(size_type n, CharType c);
00217 
00224         iterator insert(iterator pos, const CharType &item)
00225         {
00226                 size_type insert_pos = (size_type) (pos - begin());
00227                 size_type n = length();
00228                 if (insert_pos > n)
00229                         insert_pos = n;
00230                 resize(n + 1);
00231                 CharType *d = data();
00232                 for (size_type i = n+1; i > insert_pos; i--)
00233                         d[i] = d[i-1];
00234                 d[insert_pos] = item;
00235 
00236                 return begin() + insert_pos;
00237         }
00238 
00244         void insert(iterator pos, size_type num_copies, const CharType &item);
00245 
00253         CL_StringContainer &insert(size_type pos, const CL_StringData<CharType, ReferenceClass, StdString> &s);
00254 
00264         CL_StringContainer &insert(size_type pos, const CL_StringData<CharType, ReferenceClass, StdString> &s, size_type pos1, size_type length);
00265 
00272         CL_StringContainer &insert(size_type pos, const CharType *s);
00273 
00281         CL_StringContainer &insert(size_type pos, const CharType *s, size_type s_length);
00282 
00290         CL_StringContainer &insert(size_type pos, size_type n, CharType c);
00291 
00298         CL_StringContainer &append(const CL_StringData<CharType, ReferenceClass, StdString> &s);
00299 
00308         CL_StringContainer &append(const CL_StringData<CharType, ReferenceClass, StdString> &s, size_type pos, size_type n);
00309 
00310         CL_StringContainer<CharType, ReferenceClass, StdString> &append(const char *s);
00311 
00318         CL_StringContainer &append(const char *s, size_type n);
00319 
00325         CL_StringContainer &append(const wchar_t *s);
00326 
00333         CL_StringContainer &append(const wchar_t *s, size_type n);
00334 
00341         CL_StringContainer &append(size_type n, CharType c);
00342 
00346         void push_back(CharType c);
00347 
00353         iterator erase(iterator p)
00354         {
00355                 iterator e = end();
00356                 if (p == e)
00357                         return e;
00358                 return erase(p, p+1);
00359         }
00360 
00367         iterator erase(iterator first, iterator last)
00368         {
00369                 size_type pos = (size_type) (first - begin());
00370                 iterator e = end();
00371                 iterator p1 = first;
00372                 iterator p2 = last;
00373                 while (p2 != e)
00374                 {
00375                         *p1 = *p2;
00376                         p1++;
00377                         p2++;
00378                 }
00379                 size_type new_size = (size_type) (p1 - begin());
00380                 resize(new_size);
00381                 return begin() + pos;
00382         }
00383 
00390         CL_StringContainer &erase(size_type pos = 0, size_type n = CL_StringDataTypes::npos);
00391 
00400         CL_StringContainer &replace(size_type pos, size_type n, const CL_StringData<CharType, ReferenceClass, StdString> &s);
00401 
00412         CL_StringContainer &replace(size_type pos, size_type n, const CL_StringData<CharType, ReferenceClass, StdString> &s, size_type pos1, size_type n1);
00413 
00422         CL_StringContainer &replace(size_type pos, size_type n, const CharType *s, size_type n1);
00423 
00431         CL_StringContainer &replace(size_type pos, size_type n, const CharType *s);
00432 
00441         CL_StringContainer &replace(size_type pos, size_type n, size_type n1, CharType c);
00442 
00451         CL_StringContainer &replace(iterator first, iterator last, const CL_StringData<CharType, ReferenceClass, StdString> &s);
00452 
00461         CL_StringContainer &replace(iterator first, iterator last, const CharType *s, size_type n);
00462 
00470         CL_StringContainer &replace(iterator first, iterator last, const CharType *s);
00471 
00480         CL_StringContainer &replace(iterator first, iterator last, size_type n, CharType c);
00481 
00489         size_type copy(CharType *buf, size_type n, size_type pos = 0) const;
00490 
00491         CL_StringContainer &operator =(const CL_StringContainer &source);
00492         CL_StringContainer &operator =(const CL_StringData<CharType, ReferenceClass, StdString> &source);
00493         CL_StringContainer &operator =(const char *c_str);
00494         CL_StringContainer &operator =(const wchar_t *c_str);
00495         CL_StringContainer &operator +=(const CL_StringData<CharType, ReferenceClass, StdString> &s);
00496         CL_StringContainer &operator +=(const char *c_str);
00497         CL_StringContainer &operator +=(const wchar_t *c_str);
00498         CL_StringContainer &operator +=(CharType c);
00499 
00500 protected:
00501 
00503         void init();
00504 
00505         CL_MemoryPool *pool;
00506         size_type data_capacity;
00507         enum { local_string_length = 63 };
00508         CharType local_string[local_string_length + 1];
00509 };
00510 /*
00511 template <typename CharType, typename ReferenceClass, typename StdString>
00512 CL_API_CORE bool operator==(const CL_StringContainer<CharType, ReferenceClass, StdString> &s1, const CL_StringData<CharType, ReferenceClass, StdString> &s2);
00513 
00514 template <typename CharType, typename ReferenceClass, typename StdString>
00515 CL_API_CORE bool operator==(const CL_StringData<CharType, ReferenceClass, StdString> &s1, const CL_StringContainer<CharType, ReferenceClass, StdString> &s2);
00516 
00517 template <typename CharType, typename ReferenceClass, typename StdString>
00518 CL_API_CORE bool operator==(const CharType *s1, const CL_StringContainer<CharType, ReferenceClass, StdString> &s2);
00519 
00520 template <typename CharType, typename ReferenceClass, typename StdString>
00521 CL_API_CORE bool operator==(const CL_StringContainer<CharType, ReferenceClass, StdString> &s1, const CharType *s2);
00522 
00523 template <typename CharType, typename ReferenceClass, typename StdString>
00524 CL_API_CORE bool operator!=(const CL_StringContainer<CharType, ReferenceClass, StdString> &s1, const CL_StringData<CharType, ReferenceClass, StdString> &s2);
00525 
00526 template <typename CharType, typename ReferenceClass, typename StdString>
00527 CL_API_CORE bool operator!=(const CL_StringData<CharType, ReferenceClass, StdString> &s1, const CL_StringContainer<CharType, ReferenceClass, StdString> &s2);
00528 
00529 template <typename CharType, typename ReferenceClass, typename StdString>
00530 CL_API_CORE bool operator!=(const CharType *s1, const CL_StringContainer<CharType, ReferenceClass, StdString> &s2);
00531 
00532 template <typename CharType, typename ReferenceClass, typename StdString>
00533 CL_API_CORE bool operator!=(const CL_StringContainer<CharType, ReferenceClass, StdString> &s1, const CharType *s2);
00534 
00535 template <typename CharType, typename ReferenceClass, typename StdString>
00536 CL_API_CORE bool operator<(const CL_StringContainer<CharType, ReferenceClass, StdString> &s1, const CL_StringData<CharType, ReferenceClass, StdString> &s2);
00537 
00538 template <typename CharType, typename ReferenceClass, typename StdString>
00539 CL_API_CORE bool operator<(const CL_StringData<CharType, ReferenceClass, StdString> &s1, const CL_StringContainer<CharType, ReferenceClass, StdString> &s2);
00540 
00541 template <typename CharType, typename ReferenceClass, typename StdString>
00542 CL_API_CORE bool operator<(const CharType *s1, const CL_StringContainer<CharType, ReferenceClass, StdString> &s2);
00543 
00544 template <typename CharType, typename ReferenceClass, typename StdString>
00545 CL_API_CORE bool operator<(const CL_StringContainer<CharType, ReferenceClass, StdString> &s1, const CharType *s2);
00546 
00547 template <typename CharType, typename ReferenceClass, typename StdString>
00548 CL_API_CORE bool operator>(const CL_StringContainer<CharType, ReferenceClass, StdString> &s1, const CL_StringData<CharType, ReferenceClass, StdString> &s2);
00549 
00550 template <typename CharType, typename ReferenceClass, typename StdString>
00551 CL_API_CORE bool operator>(const CL_StringData<CharType, ReferenceClass, StdString> &s1, const CL_StringContainer<CharType, ReferenceClass, StdString> &s2);
00552 
00553 template <typename CharType, typename ReferenceClass, typename StdString>
00554 CL_API_CORE bool operator>(const CharType *s1, const CL_StringContainer<CharType, ReferenceClass, StdString> &s2);
00555 
00556 template <typename CharType, typename ReferenceClass, typename StdString>
00557 CL_API_CORE bool operator>(const CL_StringContainer<CharType, ReferenceClass, StdString> &s1, const CharType *s2);
00558 */
00559 #endif
00560 

Generated on Thu Dec 3 02:39:32 2009 for ClanLib by  doxygen 1.4.6