1 /*
2 * Copyright 2011 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5 #ifndef _STRING_LIST_H
6 #define _STRING_LIST_H
7
8
9 #include <BeBuild.h>
10 #include <Flattenable.h>
11 #include <List.h>
12 #include <String.h>
13
14
15 class BStringList : public BFlattenable {
16 public:
17 BStringList(int32 count = 20);
18 BStringList(const BStringList& other);
19 virtual ~BStringList();
20
21 // Adding and removing items.
22 bool Add(const BString& string, int32 index);
23 bool Add(const BString& string);
24 bool Add(const BStringList& list, int32 index);
25 bool Add(const BStringList& list);
26
27 bool Remove(const BString& string,
28 bool ignoreCase = false);
29 bool Remove(const BStringList& list,
30 bool ignoreCase = false);
31 BString Remove(int32 index);
32 bool Remove(int32 index, int32 count);
33 bool Replace(int32 index, const BString& string);
34
35 void MakeEmpty();
36
37 // Reorder items
38 void Sort(bool ignoreCase = false);
39 // TODO: Sort() with custom sort function.
40 bool Swap(int32 indexA, int32 indexB);
41 bool Move(int32 fromIndex, int32 toIndex);
42
43 // Retrieve items
44 BString StringAt(int32 index) const;
45 BString First() const;
46 BString Last() const;
47
48 // Query
49 bool HasString(const BString& string,
50 bool ignoreCase = false) const;
51 int32 IndexOf(const BString& string,
52 bool ignoreCase = false) const;
53 int32 CountStrings() const;
54 bool IsEmpty() const;
55
56 BString Join(const char* separator, int32 length = -1)
57 const;
58
59 // Iteration
60 void DoForEach(bool (*func)(const BString& string));
61 void DoForEach(bool (*func)(const BString& string,
62 void* arg2), void* arg2);
63
64 BStringList& operator=(const BStringList& other);
65 bool operator==(const BStringList& other) const;
66 bool operator!=(const BStringList& other) const;
67
68 // BFlattenable
69 virtual bool IsFixedSize() const;
70 virtual type_code TypeCode() const;
71 virtual bool AllowsTypeCode(type_code code) const;
72 virtual ssize_t FlattenedSize() const;
73 virtual status_t Flatten(void* buffer, ssize_t size) const;
74 virtual status_t Unflatten(type_code code, const void* buffer,
75 ssize_t size);
76
77 private:
78 void _IncrementRefCounts() const;
79 void _DecrementRefCounts() const;
80
81 BString _Join(const char* separator, int32 length)
82 const;
83
84 private:
85 BList fStrings;
86 };
87
88
89 inline bool
HasString(const BString & string,bool ignoreCase)90 BStringList::HasString(const BString& string, bool ignoreCase) const
91 {
92 return IndexOf(string, ignoreCase) >= 0;
93 }
94
95
96 inline bool
97 BStringList::operator!=(const BStringList& other) const
98 {
99 return !(*this == other);
100 }
101
102
103 #endif // _STRING_LIST_H
104