- Added maximization features, with corresponding plugins. Added painting feature...
[mldemos:mldemos.git] / _3rdParty / dlib / array / array_expand_1.h
1 // Copyright (C) 2006  Davis E. King (davis@dlib.net)\r
2 // License: Boost Software License   See LICENSE.txt for the full license.\r
3 #ifndef DLIB_ARRAY_EXPANd_1_\r
4 #define DLIB_ARRAY_EXPANd_1_\r
5 \r
6 #include "array_expand_abstract.h"\r
7 \r
8 namespace dlib\r
9 {\r
10 \r
11     template <\r
12         typename array_base\r
13         >\r
14     class array_expand_1 : public array_base\r
15     {\r
16         typedef typename array_base::type T;\r
17 \r
18     public:\r
19 \r
20         void resize (\r
21             unsigned long new_size\r
22         );\r
23 \r
24         const T& back (\r
25         ) const;\r
26 \r
27         T& back (\r
28         );\r
29 \r
30         void pop_back (\r
31         );\r
32 \r
33         void pop_back (\r
34             T& item\r
35         );\r
36 \r
37         void push_back (\r
38             T& item\r
39         );\r
40 \r
41     };\r
42 \r
43     template <\r
44         typename array_base\r
45         >\r
46     inline void swap (\r
47         array_expand_1<array_base>& a, \r
48         array_expand_1<array_base>& b \r
49     ) { a.swap(b); }\r
50     /*!\r
51         provides a global swap function\r
52     !*/\r
53 \r
54 // ----------------------------------------------------------------------------------------\r
55 // ----------------------------------------------------------------------------------------\r
56 // member function definitions\r
57 // ----------------------------------------------------------------------------------------\r
58 // ----------------------------------------------------------------------------------------\r
59 \r
60     template <\r
61         typename array_base\r
62         >\r
63     void array_expand_1<array_base>::\r
64     resize (\r
65         unsigned long new_size\r
66     )\r
67     {\r
68         if (this->max_size() < new_size)\r
69         {\r
70             array_base temp;\r
71             temp.set_max_size(new_size);\r
72             temp.set_size(new_size);\r
73             for (unsigned long i = 0; i < this->size(); ++i)\r
74             {\r
75                 exchange((*this)[i],temp[i]);\r
76             }\r
77             temp.swap(*this);\r
78         }\r
79         else\r
80         {\r
81             this->set_size(new_size);\r
82         }\r
83     }\r
84 \r
85 // ----------------------------------------------------------------------------------------\r
86 \r
87     template <\r
88         typename array_base\r
89         >\r
90     typename array_base::type& array_expand_1<array_base>::\r
91     back (\r
92     ) \r
93     {\r
94         return (*this)[this->size()-1];\r
95     }\r
96 \r
97 // ----------------------------------------------------------------------------------------\r
98 \r
99     template <\r
100         typename array_base\r
101         >\r
102     const typename array_base::type& array_expand_1<array_base>::\r
103     back (\r
104     ) const\r
105     {\r
106         return (*this)[this->size()-1];\r
107     }\r
108 \r
109 // ----------------------------------------------------------------------------------------\r
110 \r
111     template <\r
112         typename array_base\r
113         >\r
114     void array_expand_1<array_base>::\r
115     pop_back (\r
116         typename array_base::type& item\r
117     ) \r
118     {\r
119         exchange(item,(*this)[this->size()-1]);\r
120         this->set_size(this->size()-1);\r
121     }\r
122 \r
123 // ----------------------------------------------------------------------------------------\r
124 \r
125     template <\r
126         typename array_base\r
127         >\r
128     void array_expand_1<array_base>::\r
129     pop_back (\r
130     ) \r
131     {\r
132         this->set_size(this->size()-1);\r
133     }\r
134 \r
135 // ----------------------------------------------------------------------------------------\r
136 \r
137     template <\r
138         typename array_base\r
139         >\r
140     void array_expand_1<array_base>::\r
141     push_back (\r
142         typename array_base::type& item\r
143     ) \r
144     {\r
145         if (this->max_size() == this->size())\r
146         {\r
147             // double the size of the array\r
148             array_base temp;\r
149             temp.set_max_size(this->size()*2 + 1);\r
150             temp.set_size(this->size()+1);\r
151             for (unsigned long i = 0; i < this->size(); ++i)\r
152             {\r
153                 exchange((*this)[i],temp[i]);\r
154             }\r
155             exchange(item,temp[temp.size()-1]);\r
156             temp.swap(*this);\r
157         }\r
158         else\r
159         {\r
160             this->set_size(this->size()+1);\r
161             exchange(item,(*this)[this->size()-1]);\r
162         }\r
163     }\r
164 \r
165 // ----------------------------------------------------------------------------------------\r
166 \r
167 }\r
168 \r
169 #endif // DLIB_ARRAY_EXPANd_1_\r
170 \r