1 /* 2 * Copyright (C) 2010 Regents of the University of Michigan 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #ifndef __STRING_ARRAY_H__ 19 #define __STRING_ARRAY_H__ 20 21 #include "StringBasics.h" 22 23 class StringArray 24 { 25 protected: 26 String ** strings; 27 int size, count; 28 29 public: 30 static int alloc; 31 static bool lazyMemoryManagement; 32 33 StringArray(int startsize = 0); 34 StringArray(StringArray & original); 35 virtual ~StringArray(); 36 37 // Each line in a file is parsed into a separate array element 38 // 39 40 void Read(FILE * f); 41 void Write(FILE * f); 42 void WriteLine(FILE * f); 43 void Read(const char * filename); 44 void Write(const char * filename); 45 void WriteLine(const char * filename); 46 47 void Read(IFILE & f); 48 49 // Write all strings to the screen 50 void Print(); 51 void PrintLine(); 52 53 // Write all strings to a file 54 void Print(FILE * f); 55 void PrintLine(FILE * f); 56 57 void Grow(int newsize); 58 void Clear(); 59 Length()60 int Length() const 61 { 62 return count; 63 } 64 int Dimension(int newcount); 65 int CharLength(); 66 67 String & operator [](int i) 68 { 69 return *(strings[i]); 70 } 71 const String & operator [](int i) const 72 { 73 return *(strings[i]); 74 } 75 76 // These functions divide a string into tokens and append these to the 77 // array. Return value is the new array length 78 // 79 80 int AddColumns(const String & s, char ch = '\t'); 81 int AddColumns(const String & s, char ch, int maxColumns); 82 int AddTokens(const String & s, char ch); 83 int AddTokens(const String & s, const String & separators = " \t\r\n"); 84 85 int ReplaceColumns(const String & s, char ch = '\t') 86 { 87 Clear(); 88 return AddColumns(s, ch); 89 } 90 int ReplaceTokens(const String & s, const String & separators = " \t\r\n") 91 { 92 Clear(); 93 return AddTokens(s, separators); 94 } 95 96 // These functions add, insert or remove a single array element 97 // 98 99 int Add(const String & s); 100 void InsertAt(int position, const String & s); 101 void Delete(int position); 102 103 // These functions manipulate a string as a stack 104 // 105 106 String & Last() const; Push(const String & s)107 int Push(const String & s) 108 { 109 return Add(s); 110 } 111 String Pop(); 112 113 // Linear search (N/2 comparisons on average) for a single element 114 // If searching is required, StringMaps are a better option 115 // 116 117 int Find(const String & s) const; 118 int FastFind(const String & s) const; 119 int SlowFind(const String & s) const; 120 121 // Alphetically orders strings 122 // 123 void Sort(); 124 125 // Trims strings to remove whitespace 126 void Trim(); 127 128 StringArray & operator = (const StringArray & rhs); 129 130 bool operator == (const StringArray & rhs) const; 131 bool operator != (const StringArray & rhs) const 132 { 133 return !(*this == rhs); 134 } 135 136 void Swap(StringArray & s); 137 138 private: 139 static int ComparisonForSort(const void * a, const void * b); 140 }; 141 142 #endif 143 144