571 lines
11 KiB
C++
571 lines
11 KiB
C++
|
// file : xsd/cxx/parser/xml-schema.hxx
|
||
|
// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
|
||
|
|
||
|
#ifndef XSD_CXX_PARSER_XML_SCHEMA_HXX
|
||
|
#define XSD_CXX_PARSER_XML_SCHEMA_HXX
|
||
|
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
#include <cstddef> // std::size_t
|
||
|
|
||
|
namespace xsd
|
||
|
{
|
||
|
namespace cxx
|
||
|
{
|
||
|
namespace parser
|
||
|
{
|
||
|
// String sequence. Used for the NMTOKENS and IDREFS types.
|
||
|
//
|
||
|
template <typename C>
|
||
|
class string_sequence: public std::vector<std::basic_string<C> >
|
||
|
{
|
||
|
public:
|
||
|
typedef std::basic_string<C> value_type;
|
||
|
typedef std::vector<value_type> base;
|
||
|
typedef typename base::size_type size_type;
|
||
|
|
||
|
string_sequence ();
|
||
|
|
||
|
explicit
|
||
|
string_sequence (size_type n, const value_type& x = value_type ());
|
||
|
|
||
|
template <typename I>
|
||
|
string_sequence (const I& begin, const I& end);
|
||
|
};
|
||
|
|
||
|
template <typename C>
|
||
|
bool
|
||
|
operator== (const string_sequence<C>&, const string_sequence<C>&);
|
||
|
|
||
|
template <typename C>
|
||
|
bool
|
||
|
operator!= (const string_sequence<C>&, const string_sequence<C>&);
|
||
|
|
||
|
|
||
|
// QName
|
||
|
//
|
||
|
template <typename C>
|
||
|
class qname
|
||
|
{
|
||
|
public:
|
||
|
explicit
|
||
|
qname (const std::basic_string<C>& name);
|
||
|
|
||
|
qname (const std::basic_string<C>& prefix,
|
||
|
const std::basic_string<C>& name);
|
||
|
|
||
|
void
|
||
|
swap (qname&);
|
||
|
|
||
|
const std::basic_string<C>&
|
||
|
prefix () const;
|
||
|
|
||
|
std::basic_string<C>&
|
||
|
prefix ();
|
||
|
|
||
|
void
|
||
|
prefix (const std::basic_string<C>&);
|
||
|
|
||
|
const std::basic_string<C>&
|
||
|
name () const;
|
||
|
|
||
|
std::basic_string<C>&
|
||
|
name ();
|
||
|
|
||
|
void
|
||
|
name (const std::basic_string<C>&);
|
||
|
|
||
|
private:
|
||
|
std::basic_string<C> prefix_;
|
||
|
std::basic_string<C> name_;
|
||
|
};
|
||
|
|
||
|
template <typename C>
|
||
|
bool
|
||
|
operator== (const qname<C>&, const qname<C>&);
|
||
|
|
||
|
template <typename C>
|
||
|
bool
|
||
|
operator!= (const qname<C>&, const qname<C>&);
|
||
|
|
||
|
|
||
|
// Binary buffer. Used for the base64Binary and hexBinary types.
|
||
|
//
|
||
|
class buffer
|
||
|
{
|
||
|
public:
|
||
|
typedef std::size_t size_t;
|
||
|
|
||
|
class bounds {}; // Out of bounds exception.
|
||
|
|
||
|
public:
|
||
|
~buffer ();
|
||
|
|
||
|
explicit
|
||
|
buffer (size_t size = 0);
|
||
|
buffer (size_t size, size_t capacity);
|
||
|
buffer (const void* data, size_t size);
|
||
|
buffer (const void* data, size_t size, size_t capacity);
|
||
|
|
||
|
// If the assume_ownership argument is true, the buffer will
|
||
|
// assume the ownership of the data and will release the memory
|
||
|
// by calling operator delete ().
|
||
|
//
|
||
|
buffer (void* data,
|
||
|
size_t size,
|
||
|
size_t capacity,
|
||
|
bool assume_ownership);
|
||
|
|
||
|
buffer (const buffer&);
|
||
|
|
||
|
public:
|
||
|
buffer&
|
||
|
operator= (const buffer&);
|
||
|
|
||
|
public:
|
||
|
size_t
|
||
|
capacity () const;
|
||
|
|
||
|
// Returns true if the underlying buffer has moved.
|
||
|
//
|
||
|
bool
|
||
|
capacity (size_t);
|
||
|
|
||
|
public:
|
||
|
size_t
|
||
|
size () const;
|
||
|
|
||
|
// Returns true if the underlying buffer has moved.
|
||
|
//
|
||
|
bool
|
||
|
size (size_t);
|
||
|
|
||
|
public:
|
||
|
const char*
|
||
|
data () const;
|
||
|
|
||
|
char*
|
||
|
data ();
|
||
|
|
||
|
const char*
|
||
|
begin () const;
|
||
|
|
||
|
char*
|
||
|
begin ();
|
||
|
|
||
|
const char*
|
||
|
end () const;
|
||
|
|
||
|
char*
|
||
|
end ();
|
||
|
|
||
|
public:
|
||
|
void
|
||
|
swap (buffer&);
|
||
|
|
||
|
private:
|
||
|
bool
|
||
|
capacity (size_t capacity, bool copy);
|
||
|
|
||
|
private:
|
||
|
char* data_;
|
||
|
size_t size_;
|
||
|
size_t capacity_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const buffer&, const buffer&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const buffer&, const buffer&);
|
||
|
|
||
|
|
||
|
// Time and date types.
|
||
|
//
|
||
|
|
||
|
class time_zone
|
||
|
{
|
||
|
public:
|
||
|
time_zone ();
|
||
|
time_zone (short hours, short minutes);
|
||
|
|
||
|
// Returns true if time zone is specified.
|
||
|
//
|
||
|
bool
|
||
|
zone_present () const;
|
||
|
|
||
|
// Resets the time zone to the 'not specified' state.
|
||
|
//
|
||
|
void
|
||
|
zone_reset ();
|
||
|
|
||
|
short
|
||
|
zone_hours () const;
|
||
|
|
||
|
void
|
||
|
zone_hours (short);
|
||
|
|
||
|
short
|
||
|
zone_minutes () const;
|
||
|
|
||
|
void
|
||
|
zone_minutes (short);
|
||
|
|
||
|
private:
|
||
|
bool present_;
|
||
|
short hours_;
|
||
|
short minutes_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const time_zone&, const time_zone&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const time_zone&, const time_zone&);
|
||
|
|
||
|
|
||
|
class gday: public time_zone
|
||
|
{
|
||
|
public:
|
||
|
explicit
|
||
|
gday (unsigned short day);
|
||
|
gday (unsigned short day, short zone_hours, short zone_minutes);
|
||
|
|
||
|
unsigned short
|
||
|
day () const;
|
||
|
|
||
|
void
|
||
|
day (unsigned short);
|
||
|
|
||
|
private:
|
||
|
unsigned short day_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const gday&, const gday&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const gday&, const gday&);
|
||
|
|
||
|
|
||
|
class gmonth: public time_zone
|
||
|
{
|
||
|
public:
|
||
|
explicit
|
||
|
gmonth (unsigned short month);
|
||
|
gmonth (unsigned short month, short zone_hours, short zone_minutes);
|
||
|
|
||
|
unsigned short
|
||
|
month () const;
|
||
|
|
||
|
void
|
||
|
month (unsigned short);
|
||
|
|
||
|
private:
|
||
|
unsigned short month_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const gmonth&, const gmonth&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const gmonth&, const gmonth&);
|
||
|
|
||
|
|
||
|
class gyear: public time_zone
|
||
|
{
|
||
|
public:
|
||
|
explicit
|
||
|
gyear (int year);
|
||
|
gyear (int year, short zone_hours, short zone_minutes);
|
||
|
|
||
|
int
|
||
|
year () const;
|
||
|
|
||
|
void
|
||
|
year (int);
|
||
|
|
||
|
private:
|
||
|
int year_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const gyear&, const gyear&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const gyear&, const gyear&);
|
||
|
|
||
|
|
||
|
class gmonth_day: public time_zone
|
||
|
{
|
||
|
public:
|
||
|
gmonth_day (unsigned short month, unsigned short day);
|
||
|
gmonth_day (unsigned short month, unsigned short day,
|
||
|
short zone_hours, short zone_minutes);
|
||
|
|
||
|
unsigned short
|
||
|
month () const;
|
||
|
|
||
|
void
|
||
|
month (unsigned short);
|
||
|
|
||
|
unsigned short
|
||
|
day () const;
|
||
|
|
||
|
void
|
||
|
day (unsigned short);
|
||
|
|
||
|
private:
|
||
|
unsigned short month_;
|
||
|
unsigned short day_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const gmonth_day&, const gmonth_day&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const gmonth_day&, const gmonth_day&);
|
||
|
|
||
|
|
||
|
class gyear_month: public time_zone
|
||
|
{
|
||
|
public:
|
||
|
gyear_month (int year, unsigned short month);
|
||
|
gyear_month (int year, unsigned short month,
|
||
|
short zone_hours, short zone_minutes);
|
||
|
|
||
|
int
|
||
|
year () const;
|
||
|
|
||
|
void
|
||
|
year (int);
|
||
|
|
||
|
unsigned short
|
||
|
month () const;
|
||
|
|
||
|
void
|
||
|
month (unsigned short);
|
||
|
|
||
|
private:
|
||
|
int year_;
|
||
|
unsigned short month_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const gyear_month&, const gyear_month&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const gyear_month&, const gyear_month&);
|
||
|
|
||
|
|
||
|
class date: public time_zone
|
||
|
{
|
||
|
public:
|
||
|
date (int year, unsigned short month, unsigned short day);
|
||
|
date (int year, unsigned short month, unsigned short day,
|
||
|
short zone_hours, short zone_minutes);
|
||
|
|
||
|
int
|
||
|
year () const;
|
||
|
|
||
|
void
|
||
|
year (int);
|
||
|
|
||
|
unsigned short
|
||
|
month () const;
|
||
|
|
||
|
void
|
||
|
month (unsigned short);
|
||
|
|
||
|
unsigned short
|
||
|
day () const;
|
||
|
|
||
|
void
|
||
|
day (unsigned short);
|
||
|
|
||
|
private:
|
||
|
int year_;
|
||
|
unsigned short month_;
|
||
|
unsigned short day_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const date&, const date&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const date&, const date&);
|
||
|
|
||
|
|
||
|
class time: public time_zone
|
||
|
{
|
||
|
public:
|
||
|
time (unsigned short hours, unsigned short minutes, double seconds);
|
||
|
time (unsigned short hours, unsigned short minutes, double seconds,
|
||
|
short zone_hours, short zone_minutes);
|
||
|
|
||
|
unsigned short
|
||
|
hours () const;
|
||
|
|
||
|
void
|
||
|
hours (unsigned short);
|
||
|
|
||
|
unsigned short
|
||
|
minutes () const;
|
||
|
|
||
|
void
|
||
|
minutes (unsigned short);
|
||
|
|
||
|
double
|
||
|
seconds () const;
|
||
|
|
||
|
void
|
||
|
seconds (double);
|
||
|
|
||
|
private:
|
||
|
unsigned short hours_;
|
||
|
unsigned short minutes_;
|
||
|
double seconds_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const time&, const time&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const time&, const time&);
|
||
|
|
||
|
|
||
|
class date_time: public time_zone
|
||
|
{
|
||
|
public:
|
||
|
date_time (int year, unsigned short month, unsigned short day,
|
||
|
unsigned short hours, unsigned short minutes, double seconds);
|
||
|
|
||
|
date_time (int year, unsigned short month, unsigned short day,
|
||
|
unsigned short hours, unsigned short minutes, double seconds,
|
||
|
short zone_hours, short zone_minutes);
|
||
|
|
||
|
int
|
||
|
year () const;
|
||
|
|
||
|
void
|
||
|
year (int);
|
||
|
|
||
|
unsigned short
|
||
|
month () const;
|
||
|
|
||
|
void
|
||
|
month (unsigned short);
|
||
|
|
||
|
unsigned short
|
||
|
day () const;
|
||
|
|
||
|
void
|
||
|
day (unsigned short);
|
||
|
|
||
|
unsigned short
|
||
|
hours () const;
|
||
|
|
||
|
void
|
||
|
hours (unsigned short);
|
||
|
|
||
|
unsigned short
|
||
|
minutes () const;
|
||
|
|
||
|
void
|
||
|
minutes (unsigned short);
|
||
|
|
||
|
double
|
||
|
seconds () const;
|
||
|
|
||
|
void
|
||
|
seconds (double);
|
||
|
|
||
|
private:
|
||
|
int year_;
|
||
|
unsigned short month_;
|
||
|
unsigned short day_;
|
||
|
unsigned short hours_;
|
||
|
unsigned short minutes_;
|
||
|
double seconds_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const date_time&, const date_time&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const date_time&, const date_time&);
|
||
|
|
||
|
|
||
|
class duration
|
||
|
{
|
||
|
public:
|
||
|
duration (bool negative,
|
||
|
unsigned int years, unsigned int months, unsigned int days,
|
||
|
unsigned int hours, unsigned int minutes, double seconds);
|
||
|
|
||
|
bool
|
||
|
negative () const;
|
||
|
|
||
|
void
|
||
|
negative (bool);
|
||
|
|
||
|
unsigned int
|
||
|
years () const;
|
||
|
|
||
|
void
|
||
|
years (unsigned int);
|
||
|
|
||
|
unsigned int
|
||
|
months () const;
|
||
|
|
||
|
void
|
||
|
months (unsigned int);
|
||
|
|
||
|
unsigned int
|
||
|
days () const;
|
||
|
|
||
|
void
|
||
|
days (unsigned int);
|
||
|
|
||
|
unsigned int
|
||
|
hours () const;
|
||
|
|
||
|
void
|
||
|
hours (unsigned int);
|
||
|
|
||
|
unsigned int
|
||
|
minutes () const;
|
||
|
|
||
|
void
|
||
|
minutes (unsigned int);
|
||
|
|
||
|
double
|
||
|
seconds () const;
|
||
|
|
||
|
void
|
||
|
seconds (double);
|
||
|
|
||
|
private:
|
||
|
bool negative_;
|
||
|
unsigned int years_;
|
||
|
unsigned int months_;
|
||
|
unsigned int days_;
|
||
|
unsigned int hours_;
|
||
|
unsigned int minutes_;
|
||
|
double seconds_;
|
||
|
};
|
||
|
|
||
|
bool
|
||
|
operator== (const duration&, const duration&);
|
||
|
|
||
|
bool
|
||
|
operator!= (const duration&, const duration&);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#include <xsd/cxx/parser/xml-schema.ixx>
|
||
|
#include <xsd/cxx/parser/xml-schema.txx>
|
||
|
|
||
|
#endif // XSD_CXX_PARSER_XML_SCHEMA_HXX
|