ConnectionStrategy.hh

00001 #ifndef __SUBSCRIPTIONSERVICE__CONNECTIONSTRATEGY_CONNECTIONSTRATEGY_HH__
00002 #define __SUBSCRIPTIONSERVICE__CONNECTIONSTRATEGY_CONNECTIONSTRATEGY_HH__
00003 
00004 #include <algorithm>
00005 #include <accdevexception.hh>
00006 #include "subscriptionservice/Description/DeviceDescriptor.hh"
00007 
00008 namespace DeviceAccess
00009 {
00010   namespace Subscription
00011   {
00012     namespace ConnectionStrategy
00013     {
00014       using ::DeviceAccess::Subscription::Description::DeviceDescriptor;
00015 
00023       class ConnStrat
00024       {
00025       public:
00037         virtual void checkConns(
00038           const std::vector<DeviceDescriptor>& dds,
00039           const std::vector<int>& idxs) const
00040           throw (AccDevException) = 0;
00041 
00042         virtual ~ConnStrat() {}
00043         
00044           static const AccDevException NOTCONNECTED;
00045       };
00046 
00050       class ThrowOnZeroConns : public ConnStrat
00051       {
00052       public:
00053         virtual void checkConns(
00054           const std::vector<DeviceDescriptor>& dds,
00055           const std::vector<int>& idxs) const
00056           throw (AccDevException)
00057           {
00058             if (idxs.size() == 0)
00059               throw NOTCONNECTED;
00060           }
00061       };
00062 
00066       class ThrowAlways : public ConnStrat
00067       {
00068       public:
00069         virtual void checkConns(
00070           const std::vector<DeviceDescriptor>& dds,
00071           const std::vector<int>& idxs) const
00072           throw (AccDevException)
00073           {
00074             if (idxs.size() < dds.size())
00075               throw NOTCONNECTED;
00076           }
00077 
00078       };
00079 
00083       class ThrowNever : public ConnStrat
00084       {
00085       public:
00086         virtual void checkConns(
00087           const std::vector<DeviceDescriptor>& dds,
00088           const std::vector<int>& idxs) const
00089           throw (AccDevException)
00090           {
00091           }
00092       };
00093 
00101       class ThrowOnIdx : public ConnStrat
00102       {
00103       private:
00104         std::vector<int> _idxs;
00105 
00106       public:
00107         ThrowOnIdx(const std::vector<int> idxs) :
00108           _idxs(idxs)
00109         {
00110         }
00111 
00112         virtual void checkConns(
00113           const std::vector<DeviceDescriptor>& dds,
00114           const std::vector<int>& idxs) const
00115           throw (AccDevException)
00116           {
00117             for (std::vector<int>::const_iterator it = _idxs.begin();
00118               it != _idxs.end(); it++)
00119               if (std::find(idxs.begin(), idxs.end(), *it) == idxs.end())
00120                 throw NOTCONNECTED;
00121           }
00122       };
00123 
00131       class ThrowOnNomen : public ConnStrat
00132       {
00133       private:
00134         std::vector<string> _nomens;
00135 
00136       public:
00137         ThrowOnNomen(const std::vector<string> nomens) :
00138           _nomens(nomens)
00139         {
00140         }
00141 
00142         virtual void checkConns(
00143           const std::vector<DeviceDescriptor>& dds,
00144           const std::vector<int>& idxs) const
00145           throw (AccDevException)
00146         {
00147           for (std::vector<string>::const_iterator it = _nomens.begin();
00148             it != _nomens.end(); it++)
00149             if (std::find_if(idxs.begin(), idxs.end(),
00150               TestNomen(*it, dds))
00151               == idxs.end())
00152             {
00153               throw NOTCONNECTED;
00154             }
00155         }
00156 
00157       private:
00158         struct TestNomen {
00159             std::string _nomen;
00160             const std::vector<DeviceDescriptor>& _dds;
00161 
00162             TestNomen(
00163               const std::string& nomen,
00164               const std::vector<DeviceDescriptor>& dds) :
00165               _nomen(nomen),
00166               _dds(dds) {}
00167 
00168             bool operator()(int i)
00169             {
00170               return _nomen == _dds[i].device->nomen();
00171             }
00172           };
00173       };
00174     }
00175   }
00176 }
00177 
00178 #endif

Generated on Wed Mar 28 11:50:07 2012 for Subscription Service by  doxygen 1.4.7