Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Classes | Public Member Functions | Static Public Member Functions | Protected Attributes | Friends | List of all members
JLANG::JEquation Class Reference

General purpose equation class. More...

#include <JEquation.hh>

Classes

struct  equation_type
 Auxiliary data structure for equation. More...
 

Public Member Functions

 JEquation ()
 Default constructor. More...
 
 JEquation (const std::string &buffer, const JEquationFacet &facet)
 Constructor. More...
 
const std::string & getKey () const
 Get key. More...
 
const char getSeparator () const
 Get separator. More...
 
const std::string & getValue () const
 Get value. More...
 
JEquationsetEquation (const std::string &buffer, const JEquationFacet &facet)
 Set equation. More...
 
JEquationsetEquation (const JEquationFacet &facet)
 Set this equation to its value. More...
 
std::string toString () const
 Convert equation to string. More...
 

Static Public Member Functions

template<class T >
static equation_type< T > make_equation (const std::string &key, const T &value)
 Auxiliary method to create equation type. More...
 
static JEquation valueOf (const std::string &buffer, const JEquationFacet &facet)
 Extract equation. More...
 

Protected Attributes

JString key
 
char sep
 
JString value
 

Friends

std::istream & operator>> (std::istream &in, JEquation &equation)
 Read equation from input stream. More...
 
std::ostream & operator<< (std::ostream &out, const JEquation &equation)
 Write equation to output stream. More...
 

Detailed Description

General purpose equation class.

An equation could have the following formats:

      <skip line>  "comment"  <end of line>
      <skip line>  "comment"  <end of line>
      <key> <separator> <value> <end of line>
      <key> <separator> <left bracket> <value> <value> <right bracket> <end of line>
      <key><division><key> <separator> <value> <end of line>

In this:

In case of a division of the key, the value of the equation will include the following key up to the end of line. The special characters are defined in the JEquationParameters class. The use of this class for I/O is handled via the JEquationFacet class.

Definition at line 47 of file JEquation.hh.

Constructor & Destructor Documentation

JLANG::JEquation::JEquation ( )
inline

Default constructor.

Definition at line 126 of file JEquation.hh.

126  :
127  key (),
128  sep ('\0'),
129  value()
130  {}
JLANG::JEquation::JEquation ( const std::string &  buffer,
const JEquationFacet facet 
)
inline

Constructor.

Parameters
facetfacet
bufferinput

Definition at line 139 of file JEquation.hh.

140  {
141  setEquation(buffer, facet);
142  }
JEquation & setEquation(const std::string &buffer, const JEquationFacet &facet)
Set equation.
Definition: JEquation.hh:304

Member Function Documentation

template<class T >
static equation_type<T> JLANG::JEquation::make_equation ( const std::string &  key,
const T &  value 
)
inlinestatic

Auxiliary method to create equation type.

Parameters
keykey
valuevalue

Definition at line 117 of file JEquation.hh.

118  {
119  return equation_type<T>(key, value);
120  }
const std::string& JLANG::JEquation::getKey ( ) const
inline

Get key.

Returns
key

Definition at line 150 of file JEquation.hh.

151  {
152  return key;
153  }
const char JLANG::JEquation::getSeparator ( ) const
inline

Get separator.

Returns
separator

Definition at line 161 of file JEquation.hh.

162  {
163  return sep;
164  }
const std::string& JLANG::JEquation::getValue ( ) const
inline

Get value.

Returns
value

Definition at line 172 of file JEquation.hh.

173  {
174  return value;
175  }
JEquation& JLANG::JEquation::setEquation ( const std::string &  buffer,
const JEquationFacet facet 
)
inline

Set equation.

Parameters
bufferinput
facetfacet
Returns
this equation

Definition at line 304 of file JEquation.hh.

305  {
306  using namespace std;
307 
308  istringstream in(buffer);
309 
310  in.imbue(locale(in.getloc(), facet.clone()));
311 
312  in >> *this;
313 
314  return *this;
315  }
virtual JEquationFacet * clone() const
Clone this facet.
JEquation& JLANG::JEquation::setEquation ( const JEquationFacet facet)
inline

Set this equation to its value.

Parameters
facetfacet
Returns
this equation

Definition at line 324 of file JEquation.hh.

325  {
326  setEquation(getValue(), facet);
327 
328  return *this;
329  }
const std::string & getValue() const
Get value.
Definition: JEquation.hh:172
JEquation & setEquation(const std::string &buffer, const JEquationFacet &facet)
Set equation.
Definition: JEquation.hh:304
static JEquation JLANG::JEquation::valueOf ( const std::string &  buffer,
const JEquationFacet facet 
)
inlinestatic

Extract equation.

Parameters
bufferinput
facetfacet
Returns
equation

Definition at line 339 of file JEquation.hh.

340  {
341  return JEquation(buffer, facet);
342  }
JEquation()
Default constructor.
Definition: JEquation.hh:126
std::string JLANG::JEquation::toString ( ) const
inline

Convert equation to string.

Returns
string

Definition at line 350 of file JEquation.hh.

351  {
352  std::string buffer;
353 
354  buffer += getKey();
355  buffer += getSeparator();
356  buffer += getValue();
357 
358  return buffer;
359  }
const std::string & getKey() const
Get key.
Definition: JEquation.hh:150
const std::string & getValue() const
Get value.
Definition: JEquation.hh:172
const char getSeparator() const
Get separator.
Definition: JEquation.hh:161

Friends And Related Function Documentation

std::istream& operator>> ( std::istream &  in,
JEquation equation 
)
friend

Read equation from input stream.

Parameters
ininput stream
equationequation
Returns
input stream

Definition at line 185 of file JEquation.hh.

186  {
187  using namespace std;
188 
189  istream::sentry sentry(in, false);
190 
191  if (sentry) {
192 
193  equation = JEquation();
194 
195  const locale& loc = in.getloc();
196 
197  if (has_facet<JEquationFacet>(loc)) {
198 
199  const JEquationFacet& facet = use_facet<JEquationFacet>(loc);
200 
201  ios_base::iostate state = in.rdstate();
202 
203 
204  for (int c; (c = in.peek()) != EOF && facet.isSkipLine((char) c); ) {
205  facet.ignore(in);
206  }
207 
208 
209  if (state == ios_base::goodbit) facet.get(in, istreambuf_iterator<char>(), in, state, equation.key);
210  if (state == ios_base::goodbit) facet.get(in, istreambuf_iterator<char>(), in, state, equation.sep);
211  if (state == ios_base::goodbit) facet.getline(in, equation.value);
212 
213 
214  // remove white spaces and brackets before evaluation
215 
216  if (facet.isSeparator(equation.sep)) {
217 
218  JString::const_iterator p = equation.value. begin();
219  JString::const_reverse_iterator q = equation.value.rbegin();
220 
221  for ( ; ; ++p, ++q) {
222 
223  for ( ; p != equation.value. end() && facet.isWhiteSpace(*p); ++p) {}
224  for ( ; q != equation.value.rend() && facet.isWhiteSpace(*q); ++q) {}
225 
226  if (p == equation.value. end() || *p != facet.getLeftBracket() ||
227  q == equation.value.rend() || *q != facet.getRightBracket()) {
228  break;
229  }
230  }
231 
232  if (p != equation.value.begin() || q != equation.value.rbegin()) {
233  equation.value = string(p, q.base());
234  }
235  }
236 
237  if (state != ios_base::goodbit && state != ios_base::eofbit) {
238  in.setstate(state);
239  }
240 
241  if (!(state & ios_base::eofbit)) {
242  if (!facet.isDivision (equation.sep) &&
243  !facet.isSeparator(equation.sep)) {
244  in.setstate(ios_base::badbit);
245  }
246  }
247 
248  } else {
249 
250  in.setstate(ios_base::failbit);
251  }
252  }
253 
254  return in;
255  }
Facet class to specify parsing of equations in currect locale (see class JLANG::JEquation).
char getRightBracket() const
Get right bracket.
istreambuf_iterator get(const istreambuf_iterator __begin, const istreambuf_iterator __end, const std::ios_base &format, std::ios_base::iostate &result, char &buffer) const
Get character.
char getLeftBracket() const
Get left bracket.
std::istream & ignore(std::istream &in) const
Ignore characters until next end of line.
std::istream & getline(std::istream &in, std::string &buffer) const
Read characters until next end of line.
bool isWhiteSpace(const char c) const
Test for white space character.
bool isSkipLine(const char c) const
Test for skip line character.
bool isSeparator(const char c) const
Test for separator character.
JEquation()
Default constructor.
Definition: JEquation.hh:126
bool isDivision(const char c) const
Test for division character.
std::ostream& operator<< ( std::ostream &  out,
const JEquation equation 
)
friend

Write equation to output stream.

Parameters
outoutput stream
equationequation
Returns
output stream

Definition at line 265 of file JEquation.hh.

266  {
267  using namespace std;
268 
269  ostream::sentry sentry(out);
270 
271  if (sentry) {
272 
273  const locale& loc = out.getloc();
274 
275  if (has_facet<JEquationFacet>(loc)) {
276 
277  const JEquationFacet& facet = use_facet<JEquationFacet>(loc);
278 
279  out << equation.key;
280  out << facet.getDefaultSeparator();
281  out << equation.value;
282  out << facet.getDefaultEndOfLine();
283 
284  } else {
285 
286  out << equation.key;
287  out << equation.sep;
288  out << equation.value;
289  out << endl;
290  }
291  }
292 
293  return out;
294  }
Facet class to specify parsing of equations in currect locale (see class JLANG::JEquation).
const char getDefaultSeparator() const
Get default separator character.
const char getDefaultEndOfLine() const
Get default end of line character.

Member Data Documentation

JString JLANG::JEquation::key
protected

Definition at line 362 of file JEquation.hh.

char JLANG::JEquation::sep
protected

Definition at line 363 of file JEquation.hh.

JString JLANG::JEquation::value
protected

Definition at line 364 of file JEquation.hh.


The documentation for this class was generated from the following file: