UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
zd_coord_obj_template.hpp
1 /* zd_coord_obj_template.hpp */
2 /* $Id: zd_coord_obj_template.hpp,v 1.3 2007/04/13 19:58:01 vlad Exp $ */
3 #ifndef __zd_coord_obj_template_hpp
4 #define __zd_coord_obj_template_hpp
5 
6 #include <math.h>
7 #include <string.h>
8 
9 #include <vector>
10 #include <algorithm>
11 
12 #include "zd_coord_obj_stream.hpp"
13 
14 
60 extern int g_ZdCoordObj_iCommonNameCounter;
61 
62 template <class T>
64 {
65 private:
66 
68  std::vector<T>::iterator m_itvCoordObjs;
69 
70 public:
71 
73  std::vector<T> m_vCoordObjs;
74 
75 
77  ZdCoordObj (const char* szDocName = NULL)
78  /* All ZdCoordObj<T> classes have the same type and name counter! */
79  : ZqbAutoName(&g_ZdCoordObj_iCommonNameCounter,
80  "ZdCoordObj", szDocName)
81  {
82  /* Nothing to do */
83  }
84 
85 
88  virtual void sort () {
89  std::sort(m_vCoordObjs.begin(), m_vCoordObjs.end());
90  }
91 
92 
95  virtual bool getCoordRange (double c[2]) {
96  if(m_vCoordObjs.begin() == m_vCoordObjs.end())
97  return false;
98 
99  double mm[2];
100  std::vector<T>::iterator it = m_vCoordObjs.begin();
101  mm[0] = mm[1] = (double) *it;
102  while(it != m_vCoordObjs.end()) {
103  if(*it < mm[0])
104  mm[0] = *it;
105  if(!(*it < mm[1]))
106  mm[1] = *it;
107  ++it;
108  }
109 
110  return true;
111  }
112 
114  virtual double averageCoordStep () {
115  if(m_vCoordObjs.size() <= 1)
116  return 0.0;
117 
118  /* Get vector of delta between neighbors in container */
119  std::vector<double> m_vDelta;
120  std::vector<T>::iterator it;
121  for(it = m_vCoordObjs.begin(); it+1 != m_vCoordObjs.end(); ++it) {
122  m_vDelta.push_back(fabs((double)*it - (double)*(1+it)));
123  }
124 
125  /* Sort delta vector in ascent order */
126  std::sort(m_vDelta.begin(), m_vDelta.end());
127 
128  /* Return middle object: median estimation. */
129  return m_vDelta[m_vDelta.size()/2];
130  }
131 
133  virtual int maxEnsembleLength () {
134  return 1;
135  }
136 
137 
138  /*
139  * Iterator methods.
140  */
141 
144  virtual bool goFirstCoord () {
145  m_itvCoordObjs = m_vCoordObjs.begin();
146  return m_itvCoordObjs != m_vCoordObjs.end();
147  }
148 
151  virtual bool goNextCoord () {
152  if(m_itvCoordObjs == m_vCoordObjs.end())
153  return false;
154 
155  ++m_itvCoordObjs;
156  return true;
157  }
158 
161  virtual double coord () {
162  const T& obj = *m_itvCoordObjs;
163  return (double)obj;
164  }
165 
168  virtual int ensembleLength () {
169  return 1;
170  }
171 
172  /*
173  * Run-time type identification facility
174  */
175 
178  virtual bool compatibleType (const char* szType) const {
179  if(NULL == szType)
180  return false;
181 
182  if(!strcmp(szType, "ZdCoordObj"))
183  return true;
184 
185  return ZdCoordObjStream::compatibleType(szType);
186  }
187 
188 };
189 
190 
191 #endif /* zd_coord_obj_template.hpp */
virtual bool goNextCoord()
Definition: zd_coord_obj_template.hpp:151
virtual bool goFirstCoord()
Definition: zd_coord_obj_template.hpp:144
virtual bool getCoordRange(double c[2])
Definition: zd_coord_obj_template.hpp:95
virtual double averageCoordStep()
Definition: zd_coord_obj_template.hpp:114
std::vector< T > m_vCoordObjs
Definition: zd_coord_obj_template.hpp:73
virtual double coord()
Definition: zd_coord_obj_template.hpp:161
Definition: zd_coord_obj_stream.hpp:15
virtual int ensembleLength()
Definition: zd_coord_obj_template.hpp:168
virtual bool compatibleType(const char *szType) const
Definition: zd_coord_obj_template.hpp:63
Definition: zqb_autoname.hpp:18
virtual szDocName void sort()
Definition: zd_coord_obj_template.hpp:88
virtual int maxEnsembleLength()
Definition: zd_coord_obj_template.hpp:133
virtual bool compatibleType(const char *szType) const
Definition: zd_coord_obj_template.hpp:178