ControlArray.hxx

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2004 MUSIC TECHNOLOGY GROUP (MTG)
00003  *                         UNIVERSITAT POMPEU FABRA
00004  *
00005  *
00006  * This program is free software; you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation; either version 2 of the License, or
00009  * (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software
00018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  *
00020  */
00021 
00022 #ifndef _ControlArray_hxx_
00023 #define _ControlArray_hxx_
00024 
00025 #include "Assert.hxx"
00026 #include <vector>
00027 #include <list>
00028 #include <string>
00029 #include <sstream>
00030 
00031 namespace CLAM
00032 {
00033 
00034 class Processing;
00035 
00040 template <class ControlT>
00041 class ControlArray
00042 {
00043         typedef std::vector<ControlT *> Controls;
00044         Controls mControls;
00045 
00046 public:
00047         ControlArray() { mControls.resize(0); }
00048         ControlArray(int size, const std::string &name, Processing* parent) {
00049                 mControls.resize(0);
00050                 Resize(size,name,parent);
00051         }
00052         ControlArray(int size, const std::list<std::string> &names,
00053                         Processing* parent)
00054         {
00055                 mControls.resize(0);
00056                 Resize(size, names, parent);
00057         }
00058         ~ControlArray() { Clear(); }
00059 
00060         ControlT       &operator[](int i)        { return *mControls[i]; }
00061         const ControlT &operator[](int i) const  { return *mControls[i]; }
00062 
00063         void Resize(int size, const std::string &name, Processing* parent);
00064         void Resize(int size, const std::list<std::string>& names, Processing* parent);
00065 
00066         void Append(int size, const std::string &names, Processing* parent);
00067         void Append(int size, const std::list<std::string>& names, Processing* parent);
00068 
00069         int Size() const { return mControls.size(); }
00070 
00071         void Clear() { Shrink(0); }
00072 
00073 protected:
00074         void Shrink(int size);
00075 };
00076         
00077 template <class ControlT>
00078 void ControlArray<ControlT>::Resize(int size, const std::string &name,
00079                 Processing* parent)
00080 {
00081         int previousSize = mControls.size();
00082         if(size < previousSize) 
00083         {
00084                 Shrink(size);
00085                 return;
00086         }
00087         mControls.resize(size);
00088         for (int i = previousSize; i<size; i++) {
00089                 std::stringstream str;
00090                 str << name << "_" << i;
00091                 mControls[i] = new ControlT(str.str(), parent); 
00092         }
00093         
00094 }
00095 
00096 template <class ControlT>
00097 void ControlArray<ControlT>::Resize(int size,
00098                 const std::list<std::string>& names, Processing* parent)
00099 {
00100         int previousSize = mControls.size();
00101         if (size < previousSize) 
00102         {
00103                 Shrink(size);
00104                 return;
00105         }
00106         CLAM_ASSERT(size - previousSize <= int(names.size()),
00107                 "ControlArray::Resize: error, not enough labels provided");
00108         mControls.resize(size);
00109         std::list<std::string>::const_iterator name = names.begin();
00110         for (int i = previousSize; i<size; i++, name++)
00111                 mControls[i] = new ControlT(*name, parent);     
00112 }
00113 
00114 template <class ControlT>
00115 void ControlArray<ControlT>::Append(int count, 
00116                 const std::string &name, Processing* parent)
00117 {
00118         Resize(Size() + count, name, parent);
00119 }
00120 
00121 template <class ControlT>
00122 void ControlArray<ControlT>::Append(int count, 
00123                 const std::list<std::string>& names, Processing* parent)
00124 {
00125         Resize(Size() + count, names, parent);
00126 }
00127 
00128 
00129 template <class ControlT>
00130 void ControlArray<ControlT>::Shrink(int size)
00131 {
00132         int previousSize = mControls.size();
00133         if (size == previousSize) return;
00134         CLAM_ASSERT(size < previousSize,
00135                 "ControlArray::Cannot Shrink a ControlArray to a larger size");
00136         for (int i = previousSize-1; i >= size; i--)
00137                 delete mControls[i];    
00138         mControls.resize(size);
00139 }
00140 
00141 }; //namespace CLAM
00142 
00143 #endif
00144 

Generated on Tue Aug 12 22:33:42 2008 for CLAM by  doxygen 1.5.5