1 /*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
2  *
3  *  Use of this source code is governed by a zlib-style license that can
4  *  be found in the License.txt file in the root of the source tree.
5  */
6 
7 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 //
9 // More methods for std::vector<std::vector<std::(w)string>>
10 //
11 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12 
13 //---------------------------------------------------------------------------
14 #ifndef ZenLib_ZtringListListH
15 #define ZenLib_ZtringListListH
16 //---------------------------------------------------------------------------
17 
18 //---------------------------------------------------------------------------
19 #include "ZenLib/ZtringList.h"
20 //---------------------------------------------------------------------------
21 
22 namespace ZenLib
23 {
24 
25 //***************************************************************************
26 /// @brief Vector of vectors of strings manipulation (based on std::vector<std::vector<std::(w)string>>)
27 //***************************************************************************
28 
29 class ZtringListList : public std::vector<ZtringList>
30 {
31 public :
32     //Constructors/Destructor
33     ZtringListList ();
34     ZtringListList (const ZtringListList &Source);
35     ZtringListList (const Ztring &Source);
36     ZtringListList (const Char *Source);
37     #ifdef _UNICODE
38     ZtringListList (const char *Source); //convert a UTF-8 string into Unicode
39     #endif
40 
41     //Operateurs
42     bool            operator == (const ZtringListList &Source) const;
43     bool            operator != (const ZtringListList &Source) const;
44     ZtringListList &operator += (const ZtringListList &Source);
45     ZtringListList &operator =  (const ZtringListList &Source);
46 
47     ZtringList     &operator () (size_type Pos0); ///< Same as [], but write a empty string if Pos doesn't exist yet
48     Ztring         &operator () (size_type Pos0, size_type Pos1);
49     /// @brief Return [Pos][Pos1], Pos=First occurency of Pos0 in [xxx][0]
operator()50     Ztring         &operator () (const Ztring &Pos0, size_type Pos1=1)             {return operator() (Pos0, 0 , Pos1);}
51     /// @brief Return [Pos][Pos1], Pos=First occurency of Pos0 in [xxx][Pos0_1]
52     Ztring         &operator () (const Ztring &Pos0, size_type Pos0_1, size_type Pos1);
53 
54     //In/Out
55     /// @brief Read all
56     Ztring Read () const;
57     /// @brief Read a vector of string
58     Ztring Read (size_type Pos0) const;
59     /// @brief Read a string
60     const Ztring &Read (size_type Pos0, size_type Pos1) const;
61     /// @brief Return [Pos][Pos1], Pos=First occurency of Pos0 in [xxx][0]
62     const Ztring &Read (const Ztring &Pos0, size_type Pos1=1) const;
63     /// @brief Return [Pos][Pos1], Pos=First occurency of Pos0 in [xxx][Pos0_1]
64     const Ztring &Read (const Ztring &Pos0, size_type Pos0_1, size_type Pos1) const;
65     /// @brief Return [Pos][Pos1], Pos=First occurency of Pos0 in [xxx][0], with default value
66     const Ztring &Read (const Ztring &Pos0, const Ztring &Default, size_type Pos1=1) const;
67     /// @brief Return [Pos][Pos1], Pos=First occurency of Pos0 in [xxx][Pos0_1], with default value
68     const Ztring &Read (const Ztring &Pos0, const Ztring &Default, size_type Pos0_1, size_type Pos1) const;
69     /// @brief Read all strings at position Pos1
70     Ztring Read1 (size_type Pos1) const;
71 
72     /// @brief Write all
73     void Write (const Ztring &ToWrite);
74     /// @brief Write a vector of string
75     void Write (const ZtringList &ToWrite, size_type Pos0);
76     /// @brief Write a vector of string
77     void Write (const Ztring &ToWrite, size_type Pos0, size_type Pos1);
78     /// @brief Add a vector of string
79     void push_back (const ZtringList &ToAdd);
80     /// @brief Add a vector of string (with separator is ZtringListList Separator)
81     void push_back (const Ztring &ToAdd);
82     /// @brief Add a vector of string (Char version)
push_back(const Char * ToAdd)83     void push_back (const Char* ToAdd)                                          {push_back(Ztring(ToAdd));}
84     /// @brief Insert a vector of string at position Pos0
Insert(const ZtringList & ToInsert,size_type Pos0)85     void Insert (const ZtringList &ToInsert, size_type Pos0)                       {insert(begin()+Pos0, ToInsert);}
86     /// @brief Insert a string at all positions Pos1
87     void Insert1 (const Ztring &ToInsert, size_type Pos1);
88     /// @brief Delete a vector of string at position Pos0
Delete(size_type Pos0)89     void Delete (size_type Pos0)                                                   {erase(begin()+Pos0);}
90     /// @brief Delete all vectors of string, with [xxx][Pos1] == ToFind
91     void Delete (const Ztring &ToFind, size_type Pos1=0, const Ztring &Comparator=__T("=="), ztring_t Options=Ztring_Nothing);
92     /// @brief Delete a string at all positions Pos1
93     void Delete1 (size_type Pos1);
94 
95     //Edition
96     /// @brief Swap 2 positions
97     void Swap (size_type Pos0_A, size_type Pos0_B);
98     /// @brief Swap 2 columns for each line
99     void Swap1 (size_type Pos1_A, size_type Pos1_B);
100     /// @brief Sort
101     void Sort (size_type Pos1, ztring_t Options=Ztring_Nothing);
102 
103     //Information
104     /// @brief Find the first position of the string in the vector of vector, in a specific column
105     size_type Find (const Ztring &ToFind, size_type Pos1=0, size_type Pos0Begin=0) const;
106     /// @brief Find the first position of the string in the vector of vector, in a specific column, which is not empty
107     size_type Find_Filled (size_type Pos1=0, size_type Pos0Begin=0) const;
108     /// @brief Find the first position of the string in the vector of vector, in a specific column
109     size_type Find (const Ztring &ToFind, size_type Pos1, size_type Pos0Begin, const Ztring &Comparator, ztring_t Options=Ztring_Nothing) const;
110     /// @brief Return [xxx][Pos1Value] when founded the first position of the string in the vector of vector, in a specific column
111     Ztring FindValue (const Ztring &ToFind, size_type Pos1Value=1, size_type Pos1=0, size_type Pos0Begin=0, const Ztring &Comparator=__T("=="), ztring_t Options=Ztring_Nothing) const;
112     /// @brief Return a subsheet, with all lines with position of the string in the vector of vector, in a specific column
113     ZtringListList SubSheet (const Ztring &ToFind, size_type Pos1=0, size_type Pos0Begin=0, const Ztring &Comparator=__T("=="), ztring_t Options=Ztring_Nothing) const;
114 
115     //Configuration
116     /// @brief Set the Separator character
117     void Separator_Set (size_type Level, const Ztring &NewSeparator);
118     /// @brief Set the Quote character
119     /// During Read() or Write() method, if Separator is in the sequence, we must quote it
120     void Quote_Set (const Ztring &NewQuote);
121     /// @brief Set the Maximum number of element to read
122     /// During Read() or Write() method, if there is more elements, merge them with the last element
123     void Max_Set (size_type Level, size_type Max);
124 
125 protected :
126     Ztring Separator[2];
127     Ztring Quote;
128     size_type Max[2];
129 };
130 
131 } //namespace
132 #endif
133