Code:
#ifndef __EDIFACT_FACETTE__H__
# define __EDIFACT_FACETTE__H__
#include <iosfwd>
#include <ios>
#include <locale>
#include <iostream>
#include <streambuf>
#include <locale>
#include <string>
namespace Edifact {
using namespace std;
class EdifactFormat;
class ElementFormat;
template <class Ch, class Tr, class In> class EdifactSibling;
template <class Ch, class Tr, class In> class ElementSibling;
template <class Ch, class Tr, class In> class Request;
template <class Ch, class Tr, class In> class ServiceRequest;
template <class Ch, class Tr> class ServiceCharacters;
template <class Ch, class Tr> class Definition;
template <class Ch, class Tr> class UNOCharTraits;
template <class Ch, class Tr> class EdifactSet;
template <class Ch, class Tr> class Standard;
template <class Ch, class Tr, class In> class Carrier;
template <class Ch, class Tr, class In> class Line;
template <class Ch, class Tr, class In> class Channel;
template <class Ch, class Tr, class In> class Syntax;
template <class Ch, class Tr> class Discriminante;
template <class Ch, class Tr> class EdifactEvent;
template <class Ch, class Tr> class ServiceEvent;
template <class Ch, class Tr, class In>
const EdifactSibling<Ch, Tr, In> *edifact_sibling(
basic_istream<Ch, Tr> &is);
template <class Ch, class Tr = char_traits<Ch>,
class In = istreambuf_iterator<Ch, Tr> >
class Edifact_get: public std::locale::facet {
public:
typedef Ch char_type;
typedef Tr traits_type;
typedef In iter_type;
typedef ElementFormat un_element;
typedef EdifactFormat un_edifact;
typedef Edifact_get<Ch, Tr, In> facet_type;
typedef ServiceCharacters<Ch, Tr> service;
typedef EdifactSet<Ch, Tr> un_set;
typedef EdifactSibling<Ch, Tr, In> sibling_type;
typedef Discriminante<Ch, Tr > discriminante_type;
typedef EdifactEvent<Ch, Tr > event_type;
typedef ServiceEvent<Ch, Tr > service_event_type;
typedef Line<Ch, Tr, In> line_type;
typedef Carrier<Ch, Tr, In> carrier_type;
typedef Request<Ch, Tr, In> request_type;
typedef ServiceRequest<Ch, Tr, In> service_request_type;
typedef request_type *(Edifact_get::*Postfix)();
typedef std::basic_string <Ch, Tr> string_type;
typedef std::basic_ios <Ch, Tr> ios_type;
typedef std::basic_istream<Ch, Tr> istream_type;
protected:
Edifact_get();
virtual ~Edifact_get();
public:
In get(In begin, In end, ios_type &s, ios_base::iostate &r,
string_type &element);
In begin_of_element(In begin, In end, ios_type &s,
ios_base::iostate &r, un_element &locale, bool mandatory);
In trigger(In begin, In end, ios_type &s, ios_base::iostate &error);
In end_of_element(In begin, In end, ios_type &s, ios_base::iostate &r);
void set_character_set(ios_type &s, ios_base::iostate &r,
string_type &uno);
void set_service_characters(ios_type &s, ios_base::iostate &r,
string_type &una);
const string &_0052(ios_type &s) const;
void init(event_type *edifact, ios_type &s);
void destroy(ios_type &s);
protected: friend const sibling_type *Edifact::edifact_sibling
<Ch, Tr, In>(basic_istream<Ch, Tr> &s);
sibling_type *edifact_sibling(ios_type &s);
sibling_type *edifact_sibling(istream_type &is);
const sibling_type *edifact_sibling(ios_type &s) const;
const sibling_type *edifact_sibling(istream_type &is) const;
int status() const;
public:
discriminante_type *discriminante(ios_type &s) const;
void set_discriminante(ios_type &s, discriminante_type *value);
int discriminante() const;
};
template <class Ch, class Tr = char_traits<Ch>,
class In = istreambuf_iterator<Ch, Tr> >
class edifact_get: public Edifact_get<Ch, Tr, In> {
public:
static typename locale::id id;
};
} // namespace Edifact
#endif
namespace Edifact {
using namespace std;
template <class Ch, class Tr = char_traits<char>,
class In = istreambuf_iterator<char, char_traits<char> > >
class Typedefines {
public:
typedef const string &(
Edifact_get<Ch, Tr, In>::*Discriminante)(
basic_ios<Ch, Tr> &s) const;
typedef In (Edifact_get<Ch, Tr, In>::*SetGetElementFormat)(
In begin, In end, basic_ios<Ch, Tr> &s, ios_base::iostate &r,
ElementFormat &token, bool mandatory);
typedef In (Edifact_get<Ch, Tr, In>::*Terminator)(
In begin, In end, basic_ios<Ch, Tr> &s, ios_base::iostate &r);
typedef void (Edifact_get<Ch, Tr, In>::*Inspector)(
basic_ios<Ch, Tr> &s, ios_base::iostate &r,
basic_string<Ch, Tr> &monitor);
};
template class Typedefines<char>;
export template <class Ch, class Tr, class In>
const EdifactSibling<Ch, Tr, In> *edifact_sibling(
basic_istream<Ch, Tr> &is) {
const EdifactSibling<Ch, Tr, In> *status;
status = use_facet<Edifact::edifact_get<Ch, Tr, In> >(
is.getloc()).edifact_sibling(is);
return status;
}
template const EdifactSibling<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > > *edifact_sibling
<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is);
export template <class Ch, class Tr, class In>
const string &discriminante(basic_istream<Ch, Tr> &is,
typename Typedefines<Ch, Tr, In>::Discriminante disc) {
static string empty;
const string &result = empty;
result = (use_facet<edifact_get<Ch, Tr, In> >(is.getloc()).*disc)(is);
return result;
}
template const string &discriminante<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is,
Typedefines<char>::Discriminante disc);
export template <class Ch, class Tr, class In>
const string &_0052(basic_istream<Ch, Tr> &is) {
return discriminante(is, &Edifact_get<Ch, Tr, In>::_0052);
}
template const string &_0052<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is);
export template <class Ch, class Tr, class In>
bool skipped(basic_istream<Ch, Tr> &is) {
return skipped(edifact_sibling(is));
}
template bool skipped<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is);
export template <class Ch, class Tr, class In>
bool omit(basic_istream<Ch, Tr> &is) {
return omit(edifact_sibling(is));
}
template bool omit<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is);
export template <class Ch, class Tr, class In>
bool exist(basic_istream<Ch, Tr> &is) { return !omit(is); }
template bool exist<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is);
export template <class Ch, class Tr, class In>
basic_istream<Ch, Tr> &operator>>(basic_istream<Ch, Tr> &is,
basic_string<Ch, Tr> &s) {
ios_base::iostate state = ios_base::goodbit; // good
In eos;
use_facet<edifact_get<Ch, Tr, In> >(
is.getloc()).get(is, eos, is, state, s);
return is;
}
template istream &operator>><char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is, string &s);
export template <class Ch, class Tr, class In, class Ef, typename SgF>
basic_istream<Ch, Tr> &dataScanStatus(
basic_istream<Ch, Tr> &is,
Ef &un_format, bool mandatory, SgF status) {
ios_base::iostate state = ios_base::goodbit; // good
In eos;
(use_facet<edifact_get<Ch, Tr, In> >(is.getloc()).*status)
(is, eos, is, state, un_format, mandatory);
return is;
}
template istream &dataScanStatus<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> >, ElementFormat,
Typedefines<char>::SetGetElementFormat>(
istream &is, ElementFormat &un_format,
bool mandatory, Typedefines<char>::SetGetElementFormat sgef);
export template <class Ch, class Tr, class In>
basic_istream<Ch, Tr> &control(basic_istream<Ch, Tr> &is,
typename Typedefines<Ch, Tr, In>::Terminator terminator) {
In eos;
ios_base::iostate r = ios_base::goodbit;
(use_facet<edifact_get<Ch, Tr, In> >(
is.getloc()).*terminator)(is, eos, is, r);
return is;
}
template istream &control<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is,
Typedefines<char>::Terminator terminator);
export template <class Ch, class Tr, class In>
basic_istream<Ch, Tr> &monitoring(basic_istream<Ch, Tr> &is,
basic_string<Ch, Tr> &monitor,
typename Typedefines<Ch, Tr, In>::Inspector inspector) {
ios_base::iostate r = ios_base::goodbit;
(use_facet<edifact_get<Ch, Tr, In> >(
is.getloc()).*inspector)(is, r, monitor);
return is;
}
template istream &monitoring<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(
istream &is, string &monitor,
Typedefines<char>::Inspector inspector);
export template <class Ch, class Tr, class In>
basic_istream<Ch, Tr> &begin_of_element(
basic_istream<Ch, Tr> &is, ElementFormat &un_element,
bool mandatory) {
return dataScanStatus(is, un_element, mandatory,
&Edifact_get<Ch, Tr, In>::begin_of_element);
}
template istream &begin_of_element<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(
istream &is, ElementFormat &un_element,
bool mandatory);
export template <class Ch, class Tr, class In>
basic_istream<Ch, Tr> &end_of_element(basic_istream<Ch, Tr> &is) {
return control(is, &Edifact_get<Ch, Tr, In>::end_of_element);
}
template istream &end_of_element<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is);
export template <class Ch, class Tr, class In>
basic_istream<Ch, Tr> &trigger(basic_istream<Ch, Tr> &is) {
return control(is, &Edifact_get<Ch, Tr, In>::trigger);
}
template istream &trigger<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(istream &is);
export template <class Ch, class Tr, class In>
basic_istream<Ch, Tr> &set_service_characters(
basic_istream<Ch, Tr> &is, basic_string<Ch, Tr>&monitor) {
return monitoring(is, monitor,
&Edifact_get<Ch, Tr, In>::set_service_characters);
}
template istream &set_service_characters<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(
istream &is, string &monitor);
export template <class Ch, class Tr, class In>
basic_istream<Ch, Tr> &set_character_set(basic_istream<Ch, Tr> &is,
basic_string<Ch, Tr> &monitor) {
return monitoring(is, monitor, &Edifact_get<Ch, Tr, In>::set_character_set);
}
template istream &set_character_set<char, char_traits<char>,
istreambuf_iterator<char, char_traits<char> > >(
istream &is, string &monitor);
} // namespace Edifact