Merge branch 'main' of feistymeow.org:feisty_meow
[feisty_meow.git] / basis / base_string.h
1 #ifndef BASE_STRING_CLASS
2 #define BASE_STRING_CLASS
3
4 /*****************************************************************************\
5 *                                                                             *
6 *  Name   : base_string                                                       *
7 *  Author : Chris Koeritz                                                     *
8 *                                                                             *
9 *******************************************************************************
10 * Copyright (c) 1992-$now By Author.  This program is free software; you can  *
11 * redistribute it and/or modify it under the terms of the GNU General Public  *
12 * License as published by the Free Software Foundation; either version 2 of   *
13 * the License or (at your option) any later version.  This is online at:      *
14 *     http://www.fsf.org/copyleft/gpl.html                                    *
15 * Please send any updates to: fred@gruntose.com                               *
16 \*****************************************************************************/
17
18 //hmmm: some of these methods could be pulled out to a base_array class.
19 //      that would be a nice further abstraction.
20
21 #include "contracts.h"
22
23 namespace basis {
24
25 //! Defines the base class for all string processing objects in hoople.
26
27 class base_string : public virtual orderable
28 {
29 public:
30   virtual int length() const = 0;
31     //!< Returns the current length of the string.
32     /*!< The length returned does not include the terminating null character
33     at the end of the string. */
34
35   virtual const char *observe() const = 0;
36     //!< observes the underlying pointer to the zero-terminated string.
37     /*!< this does not allow the contents to be modified.  this method should
38     never return NULL_POINTER. */
39
40   virtual char *access() = 0;
41     //!< provides access to the actual string held.
42     /*!< this should never return NULL_POINTER.  be very careful with the returned
43     pointer: don't destroy or corrupt its contents (e.g., do not mess with
44     its zero termination). */
45
46   virtual char get(int index) const = 0;
47     //!< a constant peek at the string's internals at the specified index.
48
49   virtual void put(int position, char to_put) = 0;
50     //!< stores the character "to_put" at index "position" in the string.
51
52   virtual bool sub_compare(const base_string &to_compare, int start_first,
53           int start_second, int count, bool case_sensitive) const = 0;
54     //!< Compares "this" string with "to_compare".
55     /*!< The "start_first" is where the comparison begins in "this" string,
56     and "start_second" where it begins in the "to_compare".  The "count" is
57     the number of characters to compare between the two strings.  If either
58     index is out of range, or "count"-1 + either index is out of range, then
59     compare returns false.  If the strings differ in that range, false is
60     returned.  Only if the strings have identical contents in the range is
61     true returned.  If case-sensitive is false, then matches will not require
62     the caps and lower-case match. */
63
64   virtual base_string &assign(const base_string &s) = 0;
65     //!< Sets the contents of this string to "s".
66
67   virtual base_string &upgrade(const char *s) = 0;
68     //!< Sets the contents of this string to "s".
69
70   virtual void insert(int position, const base_string &to_insert) = 0;
71     //!< Copies "to_insert" into "this" at the "position".
72     /*!<  Characters at the index "position" and greater are moved over. */
73
74   virtual void zap(int start, int end) = 0;
75     //!< Deletes the characters between "start" and "end" inclusively.
76     /*!< C++ array conventions are used (0 through length()-1 are valid).  If
77     either index is out of bounds, then the string is not modified. */
78
79   virtual base_string &concatenate_string(const base_string &s) = 0;
80     //!< Modifies "this" by concatenating "s" onto it.
81
82   virtual base_string &concatenate_char(char c) = 0;
83     //!< concatenater for single characters.
84
85   virtual bool sub_string(base_string &target, int start, int end) const = 0;
86     //!< Gets the segment of "this" between the indices "start" and "end".
87     /*!< false is returned if the range is invalid. */
88
89   //! sets this string's contents equal to the contents of "to_copy".
90   /*! this assignment ensures that setting the base class to derived versions will
91   succeed; otherwise, a base class copy does very little. */
92   virtual base_string &operator =(const base_string &to_copy) { return assign(to_copy); }
93 };
94
95 } //namespace.
96
97 #endif
98