diff options
Diffstat (limited to 'libxsd-frontend/xsd-frontend')
91 files changed, 4408 insertions, 2724 deletions
| diff --git a/libxsd-frontend/xsd-frontend/generators/dependencies.cxx b/libxsd-frontend/xsd-frontend/generators/dependencies.cxx new file mode 100644 index 0000000..55e7ae8 --- /dev/null +++ b/libxsd-frontend/xsd-frontend/generators/dependencies.cxx @@ -0,0 +1,70 @@ +// file      : xsd-frontend/generators/dependencies.cxx +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <xsd-frontend/semantic-graph.hxx> +#include <xsd-frontend/traversal.hxx> + +#include <xsd-frontend/generators/dependencies.hxx> + +namespace XSDFrontend +{ +  typedef std::vector<SemanticGraph::Path> Paths; + +  namespace +  { +    // Go into included/imported (but not implied) schemas while making +    // sure we don't process the same stuff more than once. +    // +    struct Uses: Traversal::Uses +    { +      Uses (Paths& p): paths_ (p) {} + +      virtual void +      traverse (Type& u) +      { +        if (u.is_a<SemanticGraph::Implies> ()) +          return; + +        SemanticGraph::Schema& s (u.schema ()); + +        if (!s.context ().count ("xsd-frontend-dependencies-seen")) +        { +          s.context ().set ("xsd-frontend-dependencies-seen", true); + +          // While the edge contains the exact path that was found in the +          // schema, the schema node itself has the reative to the including +          // or importing schema path, which is what we want. +          // +          paths_.push_back (s.file ()); +          Traversal::Uses::traverse (u); +        } +      } + +    private: +      Paths& paths_; +    }; +  } + +  namespace Generators +  { +    Paths Dependencies:: +    generate (SemanticGraph::Schema& s, SemanticGraph::Path const& p) +    { +      Paths r; +      r.push_back (p); + +      Traversal::Schema schema; +      Uses uses (r); + +      schema >> uses >> schema; + +      // Some twisted schemas do recusive inclusions. +      // +      s.context ().set ("xsd-frontend-dependencies-seen", true); + +      schema.dispatch (s); +      return r; +    } +  } +} diff --git a/libxsd-frontend/xsd-frontend/generators/dependencies.hxx b/libxsd-frontend/xsd-frontend/generators/dependencies.hxx new file mode 100644 index 0000000..5a7624f --- /dev/null +++ b/libxsd-frontend/xsd-frontend/generators/dependencies.hxx @@ -0,0 +1,32 @@ +// file      : xsd-frontend/generators/dependencies.hxx +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSD_FRONTEND_GENERATORS_DEPENDENCIES_HXX +#define XSD_FRONTEND_GENERATORS_DEPENDENCIES_HXX + +#include <vector> + +#include <xsd-frontend/types.hxx> + +#include <xsd-frontend/semantic-graph/elements.hxx> // Path +#include <xsd-frontend/semantic-graph/schema.hxx> + +namespace XSDFrontend +{ +  namespace Generators +  { +    // Return the list of included/imported schema paths (transitively and +    // including the main schema file) which can then be used to produce +    // make dependencies, etc. +    // +    class Dependencies +    { +    public: +      std::vector<SemanticGraph::Path> +      generate (SemanticGraph::Schema&, SemanticGraph::Path const&); +    }; +  } +} + +#endif // XSD_FRONTEND_GENERATORS_DEPENDENCIES_HXX diff --git a/libxsd-frontend/xsd-frontend/makefile b/libxsd-frontend/xsd-frontend/makefile index abf6565..4dbffcd 100644 --- a/libxsd-frontend/xsd-frontend/makefile +++ b/libxsd-frontend/xsd-frontend/makefile @@ -1,6 +1,5 @@  # file      : xsd-frontend/makefile -# author    : Boris Kolpackov <boris@codesynthesis.com> -# copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +# copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  # license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  include $(dir $(lastword $(MAKEFILE_LIST)))../build/bootstrap.make @@ -44,7 +43,9 @@ cxx_tun += transformations/anonymous.cxx       \             transformations/schema-per-type.cxx \             transformations/simplifier.cxx -cxx_tun += parser.cxx schema-dom-parser.cxx +cxx_tun += generators/dependencies.cxx + +cxx_tun += types.cxx parser.cxx schema-dom-parser.cxx  cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o)) @@ -57,34 +58,21 @@ xsd_frontend.l.cpp-options := $(out_base)/xsd-frontend.l.cpp-options  clean   := $(out_base)/.clean -# Import. -# -$(call import,\ -  $(scf_root)/import/libboost/filesystem/stub.make,\ -  l: fs.l,cpp-options: fs.l.cpp-options) -  $(call import,\    $(scf_root)/import/libxerces-c/stub.make,\    l: xerces_c.l,cpp-options: xerces_c.l.cpp-options)  $(call import,\ -  $(scf_root)/import/libcult/stub.make,\ -  l: cult.l,cpp-options: cult.l.cpp-options) +  $(scf_root)/import/libcutl/stub.make,\ +  l: cutl.l,cpp-options: cutl.l.cpp-options) -$(call import,\ -  $(scf_root)/import/libfrontend-elements/stub.make,\ -  l: fe.l,cpp-options: fe.l.cpp-options) - -# what to build +# What to build.  # -$(xsd_frontend.l): $(cxx_obj) $(fe.l) $(cult.l) $(xerces_c.l) $(fs.l) +$(xsd_frontend.l): $(cxx_obj) $(cutl.l) $(xerces_c.l)  $(xsd_frontend.l.cpp-options): prefix := xsd-frontend/ $(out_root)/  $(xsd_frontend.l.cpp-options): value := -I$(src_root) -I$(out_root) -$(xsd_frontend.l.cpp-options):  \ -  $(fs.l.cpp-options)           \ -  $(fe.l.cpp-options)           \ -  $(cult.l.cpp-options) +$(xsd_frontend.l.cpp-options): $(cutl.l.cpp-options)  #@@ This can be further optimized since only parser depends on xerces.  # @@ -104,8 +92,11 @@ $(out_base)/: $(xsd_frontend.l)  $(clean): $(xsd_frontend.l).o.clean     \    $(xsd_frontend.l.cpp-options).clean   \    $(addsuffix .cxx.clean,$(cxx_obj))    \ -  $(addsuffix .cxx.clean,$(cxx_od))     \ -  $(addsuffix .m4.clean,$(m4_cxx)) +  $(addsuffix .cxx.clean,$(cxx_od)) + +ifneq ($(libxsd_frontend_clean_gen),n) +$(clean): $(addsuffix .m4.clean,$(m4_cxx)) +endif  # Generated .gitignore.  # diff --git a/libxsd-frontend/xsd-frontend/parser.cxx b/libxsd-frontend/xsd-frontend/parser.cxx index 901a8d3..6b582ab 100644 --- a/libxsd-frontend/xsd-frontend/parser.cxx +++ b/libxsd-frontend/xsd-frontend/parser.cxx @@ -1,21 +1,23 @@  // file      : xsd-frontend/parser.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file -#include <xsd-frontend/types.hxx> -#include <xsd-frontend/parser.hxx> +#include <map> +#include <stack> +#include <vector> +#include <iostream> +#include <sstream> + +#include <cutl/compiler/type-id.hxx> + +#include <xsd-frontend/version.hxx> // Check Xerces-C++ version.  #include <xsd-frontend/xml.hxx> +#include <xsd-frontend/parser.hxx>  #include <xsd-frontend/schema-dom-parser.hxx>  #include <xsd-frontend/semantic-graph.hxx>  #include <xsd-frontend/traversal.hxx> -#include <cult/containers/map.hxx> -#include <cult/containers/stack.hxx> -#include <cult/containers/vector.hxx> -#include <cult/rtti/type-id.hxx> -  //@@ Do i need this?  //  #include <xercesc/dom/DOM.hpp> @@ -38,15 +40,9 @@  #include <xercesc/framework/LocalFileInputSource.hpp>  #include <xercesc/framework/Wrapper4InputSource.hpp> -#include <iostream> -#include <sstream> -#include <memory>   // std::auto_ptr - -using std::wcout; -using std::wcerr; -using std::endl; +using namespace std; -using Cult::RTTI::TypeId; +using cutl::compiler::type_id;  namespace XSDFrontend  { @@ -55,7 +51,7 @@ namespace XSDFrontend    //@@ Port to tracing facility.    // -  Boolean trace_ = false; +  bool trace_ = false;    String const xsd = L"http://www.w3.org/2001/XMLSchema";    String const xse = L"http://www.codesynthesis.com/xmlns/xml-schema-extension"; @@ -107,6 +103,43 @@ namespace XSDFrontend        String name_;      }; +    // Trim leading and trailing whitespaces. +    // +    template <typename C> +    StringTemplate<C> +    trim (StringTemplate<C> const& s) +    { +      typedef StringTemplate<C> String; + +      size_t size (s.size ()); + +      if (size == 0) +        return s; + +      C const* f (s.c_str ()); +      C const* l (f + size); + +      C const* of (f); + +      while (f < l && +             (*f == C (0x20) || *f == C (0x0A) || +              *f == C (0x0D) || *f == C (0x09))) +        ++f; + +      --l; + +      C const* ol (l); + +      while (l > f && +             (*l == C (0x20) || *l == C (0x0A) || +              *l == C (0x0D) || *l == C (0x09))) +        --l; + +      if (f != of || l != ol) +        return f <= l ? String (f, l - f + 1) : String (); +      else +        return s; +    }      // Name cache. We only support maximum two nodes with the same      // name in the cache (e.g., element and type). For (rare) cases @@ -120,9 +153,9 @@ namespace XSDFrontend        Nameable* second;      }; -    typedef Cult::Containers::Map<String, CacheNodes> NodeMap; -    typedef Cult::Containers::Map<String, NodeMap> NamespaceMap; -    typedef Cult::Containers::Vector<SemanticGraph::Member*> DefaultValues; +    typedef std::map<String, CacheNodes> NodeMap; +    typedef std::map<String, NodeMap> NamespaceMap; +    typedef std::vector<SemanticGraph::Member*> DefaultValues;      template <typename X>      X& @@ -133,11 +166,11 @@ namespace XSDFrontend      {        // First check the cache.        // -      NamespaceMap::Iterator i (cache.find (ns_name)); +      NamespaceMap::iterator i (cache.find (ns_name));        if (i != cache.end ())        { -        NodeMap::Iterator j (i->second.find (uq_name)); +        NodeMap::iterator j (i->second.find (uq_name));          if (j != i->second.end ())          { @@ -188,12 +221,12 @@ namespace XSDFrontend      //      // -    typedef Cult::Containers::Map<String, String> Facets; +    typedef std::map<String, String> Facets; -    Void +    void      copy_facets (Restricts& r, Facets const& f)      { -      for (Facets::ConstIterator i (f.begin ()), e (f.end ()); i != e; ++i) +      for (Facets::const_iterator i (f.begin ()), e (f.end ()); i != e; ++i)          r.facet_insert (i->first, i->second);      } @@ -210,14 +243,14 @@ namespace XSDFrontend        String uq_name;      }; -    typedef Cult::Containers::Vector<UnionMemberType> UnionMemberTypes; +    typedef std::vector<UnionMemberType> UnionMemberTypes;      //      //      struct ElementGroupRef      {        ElementGroupRef (String const& uq_name_, String const& ns_name_, -                       UnsignedLong min_, UnsignedLong max_, +                       unsigned long min_, unsigned long max_,                         Compositor& compositor, Scope& scope)            : uq_name (uq_name_), ns_name (ns_name_),              min (min_), max (max_) @@ -232,7 +265,7 @@ namespace XSDFrontend        }        ElementGroupRef (String const& uq_name_, String const& ns_name_, -                       UnsignedLong min_, UnsignedLong max_, +                       unsigned long min_, unsigned long max_,                         Scope& scope)            : uq_name (uq_name_), ns_name (ns_name_),              min (min_), max (max_) @@ -244,13 +277,12 @@ namespace XSDFrontend        String uq_name;        String ns_name; -      UnsignedLong min, max; +      unsigned long min, max;        Compositor::ContainsIterator contains_pos;        Scope::NamesIterator names_pos;      }; -    typedef Cult::Containers::Vector<ElementGroupRef> ElementGroupRefs; - +    typedef std::vector<ElementGroupRef> ElementGroupRefs;      //      // @@ -271,7 +303,7 @@ namespace XSDFrontend        Scope::NamesIterator names_pos;      }; -    typedef Cult::Containers::Vector<AttributeGroupRef> AttributeGroupRefs; +    typedef std::vector<AttributeGroupRef> AttributeGroupRefs;      // @@ -290,14 +322,14 @@ namespace XSDFrontend        }        template <typename E> -      Void +      void        add_edge_left (E& e)        {          node_.add_edge_left (e, arg_);        }        template <typename E> -      Void +      void        add_edge_right (E& e)        {          node_.add_edge_right (e, arg_); @@ -324,7 +356,7 @@ namespace XSDFrontend                        Traversal::Compositor      {        Resolver (Schema& s, -                Boolean& valid, +                bool& valid,                  NamespaceMap& cache,                  DefaultValues& default_values)            : s_ (s), @@ -335,7 +367,7 @@ namespace XSDFrontend          *this >> contains_compositor >> *this;        } -      Void +      void        traverse (SemanticGraph::Attribute& a)        {          // Avoid traversing attribute more than once. @@ -348,13 +380,13 @@ namespace XSDFrontend          }        } -      Void +      void        traverse (SemanticGraph::Element& e)        {          resolve_element (e);        } -      Void +      void        resolve_element (SemanticGraph::Element& e)        {          // Avoid resolving element more than once. @@ -383,6 +415,15 @@ namespace XSDFrontend                resolve<SemanticGraph::Element> (ns_name, uq_name, s_, cache_));              s_.new_edge<Substitutes> (e, root); + +            // See if we need to derive the type of this element from the +            // one it substitutes. +            // +            if (!e.typed_p ()) +            { +              resolve_member (root); // Make sure the type is resolved. +              s_.new_edge<Belongs> (e, root.type ()); +            }            }            catch (NotNamespace const& ex)            { @@ -405,7 +446,7 @@ namespace XSDFrontend          }        } -      Void +      void        resolve_member (SemanticGraph::Member& m)        {          using SemanticGraph::Member; @@ -437,8 +478,15 @@ namespace XSDFrontend              m.context ().remove ("instance-ns-name");              m.context ().remove ("instance-uq-name"); - -            Member& ref (resolve<Member> (ns_name, uq_name, s_, cache_)); +            // Resolve the name to the same type. It is legal to have +            // an element and an attribute with the same name. +            // +            Member& ref ( +              m.is_a<Element> () +              ? static_cast<Member&> ( +                  resolve<Element> (ns_name, uq_name, s_, cache_)) +              : static_cast<Member&> ( +                  resolve<Attribute> (ns_name, uq_name, s_, cache_)));              // Make sure the referenced member is fully resolved.              // @@ Substitutes edge won't be resolved. @@ -509,19 +557,10 @@ namespace XSDFrontend              if (!m.annotated_p () && ref.annotated_p ())                s_.new_edge<Annotates> (ref.annotation (), m); -            // Type info. +            // Type info. Can be missing for a substitution group member.              //              if (ref.typed_p ())                s_.new_edge<Belongs> (m, ref.type ()); -            else -            { -              if (valid_) -              { -                wcerr << "ice: referenced instance '" << ns_name << "#" -                      << uq_name << "' is not typed" << endl; -                abort (); -              } -            }            }          }          catch (NotNamespace const& ex) @@ -544,19 +583,19 @@ namespace XSDFrontend          }        } -      Void +      void        traverse (SemanticGraph::Fundamental::IdRef& i)        {          ref_type (i);        } -      Void +      void        traverse (SemanticGraph::Fundamental::IdRefs& i)        {          ref_type (i);        } -      Void +      void        ref_type (SemanticGraph::Specialization& s)        {          if (s.context ().count ("type-ns-name")) @@ -584,7 +623,7 @@ namespace XSDFrontend          }        } -      Void +      void        traverse (SemanticGraph::List& l)        {          if (l.context ().count ("type-ns-name")) @@ -614,7 +653,7 @@ namespace XSDFrontend          Traversal::List::traverse (l);        } -      Void +      void        traverse (SemanticGraph::Union& u)        {          using SemanticGraph::Union; @@ -627,7 +666,7 @@ namespace XSDFrontend            // Process it backwards so that we can just insert each            // edge in the front.            // -          for (UnionMemberTypes::ConstReverseIterator i (m.rbegin ()); +          for (UnionMemberTypes::const_reverse_iterator i (m.rbegin ());                 i != m.rend (); i++)            {              try @@ -655,7 +694,7 @@ namespace XSDFrontend          Traversal::Union::traverse (u);        } -      Void +      void        traverse (SemanticGraph::Complex& c)        {          // Avoid traversing complex type more than once. @@ -669,11 +708,9 @@ namespace XSDFrontend          //          if (c.context ().count ("type-ns-name"))          { -          using Cult::RTTI::TypeId; -            String ns_name (c.context ().get<String> ("type-ns-name"));            String uq_name (c.context ().get<String> ("type-uq-name")); -          TypeId edge_id (c.context ().get<TypeId> ("edge-type-id")); +          type_id edge_id (c.context ().get<type_id> ("edge-type-id"));            c.context ().remove ("type-ns-name");            c.context ().remove ("type-uq-name"); @@ -725,7 +762,7 @@ namespace XSDFrontend            // Handle refs from last to first so that multiple insertions            // to an empty list (always front) end up in proper order.            // -          for (AttributeGroupRefs::ReverseIterator i (refs.rbegin ()); +          for (AttributeGroupRefs::reverse_iterator i (refs.rbegin ());                 i != refs.rend (); ++i)            {              clone_attribute_group_content (*i, c); @@ -756,7 +793,7 @@ namespace XSDFrontend          Traversal::Complex::traverse (c);        } -      Void +      void        traverse (SemanticGraph::Enumeration& e)        {          // Resolve base type if any. @@ -797,7 +834,7 @@ namespace XSDFrontend          Traversal::Enumeration::traverse (e);        } -      Void +      void        traverse (SemanticGraph::ElementGroup& g)        {          // Avoid traversing groups more than once. @@ -818,7 +855,7 @@ namespace XSDFrontend        // We need a "shallow" resolve to break possible recursing:        // group->element->complexType->group.        // -      Void +      void        resolve_element_group (SemanticGraph::ElementGroup& g)        {          using SemanticGraph::Scope; @@ -841,7 +878,7 @@ namespace XSDFrontend          }        } -      Void +      void        traverse (SemanticGraph::AttributeGroup& g)        {          // Avoid traversing groups more than once. @@ -861,7 +898,7 @@ namespace XSDFrontend            // Handle refs from last to first so that multiple insertions            // to an empty list (always front) end up in proper order.            // -          for (AttributeGroupRefs::ReverseIterator i (refs.rbegin ()); +          for (AttributeGroupRefs::reverse_iterator i (refs.rbegin ());                 i != refs.rend (); ++i)            {              clone_attribute_group_content (*i, g); @@ -873,7 +910,7 @@ namespace XSDFrontend          Traversal::AttributeGroup::traverse (g);        } -      Void +      void        traverse (SemanticGraph::Compositor& c)        {          using SemanticGraph::Compositor; @@ -890,7 +927,7 @@ namespace XSDFrontend            // Handle refs from last to first so that multiple insertions            // to an empty list (always front) end up in proper order.            // -          for (ElementGroupRefs::ReverseIterator i (refs.rbegin ()); +          for (ElementGroupRefs::reverse_iterator i (refs.rbegin ());                 i != refs.rend (); ++i)            {              // Find our scope. @@ -1051,8 +1088,8 @@ namespace XSDFrontend              // order to put it into the scope. Note that we cannot reuse              // the name from the prototype. -            UnsignedLong count; -            FrontendElements::Context& ctx (scope.context ()); +            unsigned long count; +            SemanticGraph::Context& ctx (scope.context ());              if (!ctx.count ("any-name-count"))              { @@ -1060,9 +1097,9 @@ namespace XSDFrontend                ctx.set ("any-name-count", count);              }              else -              count = ++(ctx.get<UnsignedLong> ("any-name-count")); +              count = ++(ctx.get<unsigned long> ("any-name-count")); -            std::basic_ostringstream<WideChar> os; +            std::basic_ostringstream<wchar_t> os;              os << "any #" << count;              NodeArgs<Scope, Scope::NamesIterator> na (scope, pos); @@ -1126,7 +1163,7 @@ namespace XSDFrontend          return copy;        } -      Void +      void        clone_attribute_group_content (AttributeGroupRef& ref,                                       SemanticGraph::Scope& s)        { @@ -1213,8 +1250,8 @@ namespace XSDFrontend                // one in order to put it into the scope. Note that we cannot                // reuse the name from the attribute group. -              UnsignedLong count; -              FrontendElements::Context& ctx (s.context ()); +              unsigned long count; +              SemanticGraph::Context& ctx (s.context ());                if (!ctx.count ("any-attribute-name-count"))                { @@ -1222,9 +1259,9 @@ namespace XSDFrontend                  ctx.set ("any-attribute-name-count", count);                }                else -                count = ++(ctx.get<UnsignedLong> ("any-attribute-name-count")); +                count = ++(ctx.get<unsigned long> ("any-attribute-name-count")); -              std::basic_ostringstream<WideChar> os; +              std::basic_ostringstream<wchar_t> os;                os << "any-attribute #" << count;                NodeArgs<Scope, Scope::NamesIterator> na (s, pos); @@ -1256,7 +1293,7 @@ namespace XSDFrontend      private:        Schema& s_; -      Boolean& valid_; +      bool& valid_;        NamespaceMap& cache_;        DefaultValues& default_values_; @@ -1266,67 +1303,54 @@ namespace XSDFrontend      };    } -  // -  // -  struct FilePathComparator -  { -    Boolean -    operator () (SemanticGraph::Path const& x, -                 SemanticGraph::Path const& y) const -    { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -        return x.native_file_string () < y.native_file_string (); -#else -        return x.string () < y.string (); -#endif -    } -  }; -    // Parser::Impl    // -  class Parser::Impl: public NonCopyable +  class Parser::Impl    { +    Impl (Impl const&); +    Impl& operator= (Impl const&); +    public:      ~Impl (); -    Impl (Boolean proper_restriction, -          Boolean multiple_imports, -          Boolean full_schema_check, +    Impl (bool proper_restriction, +          bool multiple_imports, +          bool full_schema_check,            LocationTranslator*,            const WarningSet*); -    Evptr<Schema> +    auto_ptr<Schema>      parse (Path const&); -    Evptr<Schema> +    auto_ptr<Schema>      parse (Paths const&); -    Evptr<Schema> +    auto_ptr<Schema>      xml_schema (Path const&);    private: -    Void +    void      fill_xml_schema (Schema&, Path const&);    private:      XML::AutoPtr<Xerces::DOMDocument> -    dom (SemanticGraph::Path const&, Boolean validate); +    dom (SemanticGraph::Path const&, bool validate); -    Void +    void      schema (XML::Element const&);      SemanticGraph::Annotation* -    annotation (Boolean process); +    annotation (bool process); -    Void +    void      import (XML::Element const&); -    Void +    void      include (XML::Element const&); -    Void -    element_group (XML::Element const&, Boolean in_compositor); +    void +    element_group (XML::Element const&, bool in_compositor);      SemanticGraph::Type*      simple_type (XML::Element const&); @@ -1340,7 +1364,7 @@ namespace XSDFrontend      SemanticGraph::Type*      restriction (XML::Element const& r, XML::Element const& type); -    Void +    void      enumeration (XML::Element const&);      SemanticGraph::Type* @@ -1350,47 +1374,47 @@ namespace XSDFrontend      all (XML::Element const&);      Choice* -    choice (XML::Element const&, Boolean in_compositor); +    choice (XML::Element const&, bool in_compositor);      Sequence* -    sequence (XML::Element const&, Boolean in_compositor); +    sequence (XML::Element const&, bool in_compositor); -    Void +    void      simple_content (XML::Element const&); -    Void +    void      complex_content (XML::Element const&, Complex&); -    Void +    void      simple_content_extension (XML::Element const&); -    Void +    void      simple_content_restriction (XML::Element const&); -    Void +    void      complex_content_extension (XML::Element const&, Complex&); -    Void +    void      complex_content_restriction (XML::Element const&, Complex&); -    Void -    element (XML::Element const&, Boolean global); +    void +    element (XML::Element const&, bool global); -    Void -    attribute (XML::Element const&, Boolean global); +    void +    attribute (XML::Element const&, bool global); -    Void +    void      attribute_group (XML::Element const&); -    Void +    void      any (XML::Element const&); -    Void +    void      any_attribute (XML::Element const&);    private: -    Boolean -    is_disabled (Char const* warning) +    bool +    is_disabled (char const* warning)      {        return disabled_warnings_all_ ||          (disabled_warnings_ && @@ -1398,10 +1422,10 @@ namespace XSDFrontend      }    private: -    Boolean +    bool      more () const      { -      Iterator const& it (iteration_state_.top ()); +      iterator const& it (iteration_state_.top ());        return it.l_->getLength () > it.i_;      } @@ -1409,41 +1433,41 @@ namespace XSDFrontend      XML::Element      next ()      { -      Iterator& it (iteration_state_.top ()); +      iterator& it (iteration_state_.top ());        return XML::Element (          dynamic_cast<Xerces::DOMElement*> (it.l_->item (it.i_++)));      } -    Void +    void      prev ()      { -      Iterator& it (iteration_state_.top ()); +      iterator& it (iteration_state_.top ());        if (it.i_)          --it.i_;      } -    Void +    void      push (XML::Element const& e)      {        iteration_state_.push (e.dom_element ());      } -    Void +    void      pop ()      {        iteration_state_.pop ();      }    private: -    Void +    void      push_scope (SemanticGraph::Scope& s)      {        scope_stack_.push (&s);      } -    Void +    void      pop_scope ()      {        scope_stack_.pop (); @@ -1456,13 +1480,13 @@ namespace XSDFrontend      }    private: -    Void +    void      push_compositor (SemanticGraph::Compositor& c)      {        compositor_stack_.push (&c);      } -    Void +    void      pop_compositor ()      {        assert (!compositor_stack_.empty ()); @@ -1477,30 +1501,32 @@ namespace XSDFrontend      }    private: -    UnsignedLong +    static unsigned long const unbounded = ~static_cast<unsigned long> (0); + +    unsigned long      parse_min (String const& m)      {        if (m.empty ())          return 1; -      UnsignedLong v; -      std::basic_istringstream<WideChar> is (m); +      unsigned long v; +      std::basic_istringstream<wchar_t> is (m);        is >> v;        return v;      } -    UnsignedLong +    unsigned long      parse_max (String const& m)      {        if (m.empty ())          return 1;        if (m == L"unbounded") -        return 0; +        return unbounded; -      UnsignedLong v; -      std::basic_istringstream<WideChar> is (m); +      unsigned long v; +      std::basic_istringstream<wchar_t> is (m);        is >> v;        return v; @@ -1590,32 +1616,32 @@ namespace XSDFrontend    private:      XML::PtrVector<Xerces::DOMDocument>* dom_docs_; -    struct Iterator +    struct iterator      { -      Iterator (Xerces::DOMElement* e) +      iterator (Xerces::DOMElement* e)            : l_ (e->getChildNodes ()), i_ (0)        {        }        Xerces::DOMNodeList* l_; -      Size i_; +      size_t i_;      }; -    Cult::Containers::Stack<Iterator> iteration_state_; +    std::stack<iterator> iteration_state_;      SemanticGraph::Schema* s_;   // root schema file      SemanticGraph::Schema* cur_; // current schema file -    Boolean cur_chameleon_;      // whethere cur_ is chameleon +    bool cur_chameleon_;      // whethere cur_ is chameleon      SemanticGraph::Schema* xml_schema_; // XML Schema file      SemanticGraph::Path xml_schema_path_;      //      // -    Cult::Containers::Stack<SemanticGraph::Scope*> scope_stack_; +    std::stack<SemanticGraph::Scope*> scope_stack_;      //      // -    Cult::Containers::Stack<SemanticGraph::Compositor*> compositor_stack_; +    std::stack<SemanticGraph::Compositor*> compositor_stack_;      // Map of absolute file path and namespace pair to a Schema node. @@ -1628,18 +1654,10 @@ namespace XSDFrontend        } -      friend Boolean +      friend bool        operator< (SchemaId const& x, SchemaId const& y)        { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -        return x.path_.native_file_string () < y.path_.native_file_string () -          || (x.path_.native_file_string () == y.path_.native_file_string () -              && x.ns_ < y.ns_); -#else -        return x.path_.string () < y.path_.string () -          || (x.path_.string () == y.path_.string () -              && x.ns_ < y.ns_); -#endif +        return x.path_ < y.path_ || (x.path_ == y.path_ && x.ns_ < y.ns_);        }      private: @@ -1648,20 +1666,33 @@ namespace XSDFrontend      }; -    typedef -    Cult::Containers::Map<SchemaId, SemanticGraph::Schema*> -    SchemaMap; - +    typedef std::map<SchemaId, SemanticGraph::Schema*> SchemaMap;      SchemaMap schema_map_;      // Path stack for diagnostic.      // -    Cult::Containers::Stack<SemanticGraph::Path> file_stack_; +    struct PathPair +    { +      PathPair (SemanticGraph::Path const& r, SemanticGraph::Path const& a) +          : rel (r), abs (a) +      { +      } + +      SemanticGraph::Path rel, abs; +    }; + +    std::stack<PathPair> file_stack_;      SemanticGraph::Path const&      file ()      { -      return file_stack_.top (); +      return file_stack_.top ().rel; +    } + +    SemanticGraph::Path const& +    abs_file () +    { +      return file_stack_.top ().abs;      }      // Members with default/fixed values (needed for QName handling). @@ -1669,26 +1700,26 @@ namespace XSDFrontend      DefaultValues default_values_;    private: -    Boolean qualify_attribute_; -    Boolean qualify_element_; +    bool qualify_attribute_; +    bool qualify_element_; -    Boolean valid_; +    bool valid_; -    Boolean proper_restriction_; -    Boolean multiple_imports_; -    Boolean full_schema_check_; +    bool proper_restriction_; +    bool multiple_imports_; +    bool full_schema_check_;      LocationTranslator* loc_translator_;      const WarningSet* disabled_warnings_; -    Boolean disabled_warnings_all_; +    bool disabled_warnings_all_;      NamespaceMap* cache_;    };    Parser::Impl:: -  Impl (Boolean proper_restriction, -        Boolean multiple_imports, -        Boolean full_schema_check, +  Impl (bool proper_restriction, +        bool multiple_imports, +        bool full_schema_check,          LocationTranslator* t,          const WarningSet* dw)        : s_ (0), @@ -1730,7 +1761,7 @@ namespace XSDFrontend      return node;    } -  Void Parser::Impl:: +  void Parser::Impl::    fill_xml_schema (Schema& s, Path const& path)    {      Namespace& ns (s.new_node<Namespace> (path, 1, 1)); @@ -1829,12 +1860,12 @@ namespace XSDFrontend    } -  Evptr<Schema> Parser::Impl:: +  auto_ptr<Schema> Parser::Impl::    xml_schema (Path const& tu)    {      valid_ = true; -    Evptr<Schema> rs (new Schema (tu, 1, 1)); +    auto_ptr<Schema> rs (new Schema (tu, 1, 1));      fill_xml_schema (*rs, tu);      if (!valid_) @@ -1842,7 +1873,7 @@ namespace XSDFrontend      return rs;    } -  Evptr<Schema> Parser::Impl:: +  auto_ptr<Schema> Parser::Impl::    parse (Path const& tu)    {      valid_ = true; @@ -1861,12 +1892,12 @@ namespace XSDFrontend        throw InvalidSchema ();      XML::Element root (d->getDocumentElement ()); -    String ns (root["targetNamespace"]); +    String ns (trim (root["targetNamespace"]));      if (trace_)        wcout << "target namespace: " << ns << endl; -    Evptr<Schema> rs (new Schema (tu, root.line (), root.column ())); +    auto_ptr<Schema> rs (new Schema (tu, root.line (), root.column ()));      // Implied schema with fundamental types.      // @@ -1878,16 +1909,18 @@ namespace XSDFrontend      // Parse.      //      { -      // Enter the file into schema_map_. +      // Enter the file into schema_map_. Do normalize() before +      // complete() to avoid hitting system path limits with '..' +      // directories.        // -      Path abs_path (system_complete (tu)); -      abs_path.normalize (); +      Path abs_path (tu); +      abs_path.normalize ().complete ();        schema_map_[SchemaId (abs_path, ns)] = rs.get ();        rs->context ().set ("absolute-path", abs_path);        s_ = cur_ = rs.get ();        { -        file_stack_.push (tu); +        file_stack_.push (PathPair (tu, abs_path));          {            push_scope ( @@ -1919,7 +1952,7 @@ namespace XSDFrontend        struct Uses: Traversal::Uses        { -        virtual Void +        virtual void          traverse (Type& u)          {            Schema& s (u.schema ()); @@ -1945,24 +1978,24 @@ namespace XSDFrontend                                Traversal::Element,                                Traversal::Member        { -        AnonymousMember (Traversal::NodeDispatcherBase& d) +        AnonymousMember (Traversal::NodeDispatcher& d)          {            belongs_.node_traverser (d);          } -        virtual Void +        virtual void          traverse (SemanticGraph::Attribute& a)          {            traverse_member (a);          } -        virtual Void +        virtual void          traverse (SemanticGraph::Element& e)          {            traverse_member (e);          } -        Void +        void          traverse_member (SemanticGraph::Member& m)          {            if (m.typed_p () && @@ -1983,12 +2016,12 @@ namespace XSDFrontend        struct AnonymousBase: Traversal::Type        { -        AnonymousBase (Traversal::NodeDispatcherBase& d) +        AnonymousBase (Traversal::NodeDispatcher& d)              : base_ (d)          {          } -        virtual Void +        virtual void          traverse (SemanticGraph::Type& t)          {            if (!t.named_p ()) @@ -1996,7 +2029,7 @@ namespace XSDFrontend          }        private: -        Traversal::NodeDispatcherBase& base_; +        Traversal::NodeDispatcher& base_;        } anonymous_base (resolver);        ns_names >> resolver; @@ -2020,7 +2053,7 @@ namespace XSDFrontend      //      if (valid_)      { -      for (DefaultValues::ConstIterator i (default_values_.begin ()), +      for (DefaultValues::const_iterator i (default_values_.begin ()),               e (default_values_.end ()); i != e; ++i)        {          SemanticGraph::Member& m (**i); @@ -2068,7 +2101,7 @@ namespace XSDFrontend      return rs;    } -  Evptr<Schema> Parser::Impl:: +  auto_ptr<Schema> Parser::Impl::    parse (Paths const& paths)    {      valid_ = true; @@ -2081,7 +2114,7 @@ namespace XSDFrontend      NamespaceMap cache;      cache_ = &cache; -    Evptr<Schema> rs (new Schema ("", 0, 0)); +    auto_ptr<Schema> rs (new Schema (Path (), 0, 0));      // Implied schema with fundamental types.      // @@ -2094,7 +2127,7 @@ namespace XSDFrontend      //      s_ = rs.get (); -    for (Paths::ConstIterator i (paths.begin ()); i != paths.end (); ++i) +    for (Paths::const_iterator i (paths.begin ()); i != paths.end (); ++i)      {        Path const& tu (*i);        XML::AutoPtr<Xerces::DOMDocument> d (dom (tu, true)); @@ -2103,15 +2136,17 @@ namespace XSDFrontend          throw InvalidSchema ();        XML::Element root (d->getDocumentElement ()); -      String ns (root["targetNamespace"]); +      String ns (trim (root["targetNamespace"]));        if (trace_)          wcout << "target namespace: " << ns << endl; -      // Check if we already have this schema. +      // Check if we already have this schema. Do normalize() before +      // complete() to avoid hitting system path limits with '..' +      // directories.        // -      Path abs_path (system_complete (tu)); -      abs_path.normalize (); +      Path abs_path (tu); +      abs_path.normalize ().complete ();        SchemaId schema_id (abs_path, ns);        if (schema_map_.find (schema_id) != schema_map_.end ()) @@ -2129,7 +2164,7 @@ namespace XSDFrontend        cur_ = &s;        { -        file_stack_.push (tu); +        file_stack_.push (PathPair (tu, abs_path));          {            push_scope ( @@ -2166,7 +2201,7 @@ namespace XSDFrontend        struct Uses: Traversal::Uses        { -        virtual Void +        virtual void          traverse (Type& u)          {            Schema& s (u.schema ()); @@ -2192,24 +2227,24 @@ namespace XSDFrontend                                Traversal::Element,                                Traversal::Member        { -        AnonymousMember (Traversal::NodeDispatcherBase& d) +        AnonymousMember (Traversal::NodeDispatcher& d)          {            belongs_.node_traverser (d);          } -        virtual Void +        virtual void          traverse (SemanticGraph::Attribute& a)          {            traverse_member (a);          } -        virtual Void +        virtual void          traverse (SemanticGraph::Element& e)          {            traverse_member (e);          } -        virtual Void +        virtual void          traverse_member (SemanticGraph::Member& m)          {            if (m.typed_p () && @@ -2230,12 +2265,12 @@ namespace XSDFrontend        struct AnonymousBase: Traversal::Type        { -        AnonymousBase (Traversal::NodeDispatcherBase& d) +        AnonymousBase (Traversal::NodeDispatcher& d)              : base_ (d)          {          } -        virtual Void +        virtual void          traverse (SemanticGraph::Type& t)          {            if (!t.named_p ()) @@ -2243,7 +2278,7 @@ namespace XSDFrontend          }        private: -        Traversal::NodeDispatcherBase& base_; +        Traversal::NodeDispatcher& base_;        } anonymous_base (resolver);        ns_names >> resolver; @@ -2267,7 +2302,7 @@ namespace XSDFrontend      //      if (valid_)      { -      for (DefaultValues::ConstIterator i (default_values_.begin ()), +      for (DefaultValues::const_iterator i (default_values_.begin ()),               e (default_values_.end ()); i != e; ++i)        {          SemanticGraph::Member& m (**i); @@ -2315,17 +2350,21 @@ namespace XSDFrontend      return rs;    } -  Void Parser::Impl:: +  void Parser::Impl::    schema (XML::Element const& s)    { -    Boolean old_qa (qualify_attribute_); -    Boolean old_qe (qualify_element_); +    bool old_qa (qualify_attribute_); +    bool old_qe (qualify_element_); -    if (String af = s["attributeFormDefault"]) +    if (String af = trim (s["attributeFormDefault"]))        qualify_attribute_ = af == L"qualified"; +    else +      qualify_attribute_ = false; -    if (String ef = s["elementFormDefault"]) +    if (String ef = trim (s["elementFormDefault"]))        qualify_element_ = ef == L"qualified"; +    else +      qualify_element_ = false;      push (s); @@ -2367,52 +2406,43 @@ namespace XSDFrontend      qualify_element_ = old_qe;    } -  Void Parser::Impl:: +  void Parser::Impl::    import (XML::Element const& i)    {      NarrowString loc ( -      XML::transcode_to_narrow ( -        i.dom_element ()->getAttribute ( -          XML::XMLChString ("schemaLocation").c_str ()))); +      trim ( +        XML::transcode_to_narrow ( +          i.dom_element ()->getAttribute ( +            XML::XMLChString ("schemaLocation").c_str ()))));      if (loc_translator_)        loc = loc_translator_->translate (loc); +    String ins (trim (i["namespace"])); +      // Ignore empty <import>.      // -    if (!loc && !i["namespace"]) +    if (!loc && !ins)        return;      Path path, rel_path, abs_path;      try      { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -      try -      { -        path = Path (loc); -      } -      catch (InvalidPath const&) -      { -        // Retry as a native path. -        // -        path = Path (loc, boost::filesystem::native); -      } -#else -      // The new ABI does not have a fallback native representation -      path = Path (loc.c_str()); -#endif +      path = Path (loc); -      if (path.is_complete ()) +      if (path.absolute ())        {          abs_path = rel_path = path; +        abs_path.normalize ();        }        else        { -        rel_path = file ().branch_path () / path; -        abs_path = system_complete (rel_path); +        // Do normalize() before complete() to avoid hitting system path +        // limits with '..' directories. +        // +        abs_path = rel_path = file ().directory () / path; +        abs_path.normalize ().complete ();        } - -      abs_path.normalize ();      }      catch (InvalidPath const&)      { @@ -2424,7 +2454,7 @@ namespace XSDFrontend        return;      } -    SchemaId schema_id (abs_path, i["namespace"]); +    SchemaId schema_id (abs_path, ins);      if (schema_map_.find (schema_id) != schema_map_.end ())      { @@ -2438,7 +2468,7 @@ namespace XSDFrontend      if (XML::AutoPtr<Xerces::DOMDocument> d  = dom (abs_path, false))      {        XML::Element r (d->getDocumentElement ()); -      String ns (r["targetNamespace"]); +      String ns (trim (r["targetNamespace"]));        if (trace_)          wcout << "target namespace: " << ns << endl; @@ -2451,12 +2481,12 @@ namespace XSDFrontend        s.context ().set ("absolute-path", abs_path);        Schema* old_cur (cur_); -      Boolean old_cur_chameleon (cur_chameleon_); +      bool old_cur_chameleon (cur_chameleon_);        cur_ = &s;        cur_chameleon_ = false;        { -        file_stack_.push (rel_path); +        file_stack_.push (PathPair (rel_path, abs_path));          {            push_scope ( @@ -2480,13 +2510,14 @@ namespace XSDFrontend      }    } -  Void Parser::Impl:: +  void Parser::Impl::    include (XML::Element const& i)    {      NarrowString loc ( -      XML::transcode_to_narrow ( -        i.dom_element ()->getAttribute ( -          XML::XMLChString ("schemaLocation").c_str ()))); +      trim ( +        XML::transcode_to_narrow ( +          i.dom_element ()->getAttribute ( +            XML::XMLChString ("schemaLocation").c_str ()))));      if (loc_translator_)        loc = loc_translator_->translate (loc); @@ -2494,33 +2525,21 @@ namespace XSDFrontend      Path path, rel_path, abs_path;      try      { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -      try -      { -        path = Path (loc); -      } -      catch (InvalidPath const&) -      { -        // Retry as a native path. -        // -        path = Path (loc, boost::filesystem::native); -      } -#else -      // The new API does not have a fallback native representation. -      path = Path (loc.c_str()); -#endif +      path = Path (loc); -      if (path.is_complete ()) +      if (path.absolute ())        {          abs_path = rel_path = path; +        abs_path.normalize ();        }        else        { -        rel_path = file ().branch_path () / path; -        abs_path = system_complete (rel_path); +        // Do normalize() before complete() to avoid hitting system path +        // limits with '..' directories. +        // +        abs_path = rel_path = file ().directory () / path; +        abs_path.normalize ().complete ();        } - -      abs_path.normalize ();      }      catch (InvalidPath const&)      { @@ -2559,7 +2578,7 @@ namespace XSDFrontend      if (XML::AutoPtr<Xerces::DOMDocument> d  = dom (abs_path, false))      {        XML::Element r (d->getDocumentElement ()); -      String ns (r["targetNamespace"]), cur_ns; +      String ns (trim (r["targetNamespace"])), cur_ns;        Schema& s (s_->new_node<Schema> (rel_path, r.line (), r.column ()));        s_->new_edge<Implies> (s, *xml_schema_, xml_schema_path_); @@ -2567,7 +2586,7 @@ namespace XSDFrontend        schema_map_[schema_id] = &s;        s.context ().set ("absolute-path", abs_path); -      Boolean chameleon (false); +      bool chameleon (false);        if (ns.empty () && !(cur_ns = (cur_->names_begin ())->name ()).empty ())        { @@ -2587,12 +2606,12 @@ namespace XSDFrontend          wcout << "target namespace: " << ns << endl;        Schema* old_cur (cur_); -      Boolean old_cur_chameleon (cur_chameleon_); +      bool old_cur_chameleon (cur_chameleon_);        cur_ = &s;        cur_chameleon_ = chameleon;        { -        file_stack_.push (rel_path); +        file_stack_.push (PathPair (rel_path, abs_path));          {            push_scope ( @@ -2616,10 +2635,10 @@ namespace XSDFrontend      }    } -  Void Parser::Impl:: -  element_group (XML::Element const& g, Boolean in_compositor) +  void Parser::Impl:: +  element_group (XML::Element const& g, bool in_compositor)    { -    if (String name = g["name"]) +    if (String name = trim (g["name"]))      {        ElementGroup& group (          s_->new_node<ElementGroup> (file (), g.line (), g.column ())); @@ -2659,7 +2678,7 @@ namespace XSDFrontend        pop ();        pop_scope ();      } -    else if (String ref = g["ref"]) +    else if (String ref = trim (g["ref"]))      {        if (trace_)          wcout << "element-group-ref " << ref << endl; @@ -2681,10 +2700,15 @@ namespace XSDFrontend          {            Compositor& c (compositor ()); +          unsigned long min (parse_min (trim (g["minOccurs"]))); +          unsigned long max (parse_max (trim (g["maxOccurs"]))); +            ElementGroupRef ref (              uq_name, ns_name, -            parse_min (g["minOccurs"]), parse_max (g["maxOccurs"]), -            c, scope ()); +            min, +            max == unbounded ? 0 : max, +            c, +            scope ());            if (!c.context ().count ("element-group-refs"))              c.context ().set ("element-group-refs", ElementGroupRefs ()); @@ -2699,10 +2723,11 @@ namespace XSDFrontend            Scope& s (scope ()); +          unsigned long min (parse_min (trim (g["minOccurs"]))); +          unsigned long max (parse_max (trim (g["maxOccurs"]))); +            ElementGroupRef ref ( -            uq_name, ns_name, -            parse_min (g["minOccurs"]), parse_max (g["maxOccurs"]), -            s); +            uq_name, ns_name, min, max == unbounded ? 0 : max, s);            s.context ().set ("element-group-ref", ref);          } @@ -2782,7 +2807,7 @@ namespace XSDFrontend      List& node (s_->new_node<List> (file (), t.line (), t.column ())); -    if (String item_type = l["itemType"]) +    if (String item_type = trim (l["itemType"]))      {        if (trace_)          wcout << "item type: " << fq_name (l, item_type) << endl; @@ -2832,7 +2857,7 @@ namespace XSDFrontend        pop ();      } -    if (String name = t["name"]) +    if (String name = trim (t["name"]))        s_->new_edge<Names> (scope (), node, name);      return &node; @@ -2846,8 +2871,8 @@ namespace XSDFrontend      // Find first non-space character.      // -    Size -    find_ns (const WideChar* s, Size size, Size pos) +    size_t +    find_ns (const wchar_t* s, size_t size, size_t pos)      {        while (pos < size &&               (s[pos] == 0x20 || // space @@ -2861,8 +2886,8 @@ namespace XSDFrontend      // Find first space character.      // -    Size -    find_s (const WideChar* s, Size size, Size pos) +    size_t +    find_s (const wchar_t* s, size_t size, size_t pos)      {        while (pos < size &&               s[pos] != 0x20 && // space @@ -2883,26 +2908,26 @@ namespace XSDFrontend      Union& node (s_->new_node<Union> (file (), t.line (), t.column ())); -    Boolean has_members (false); +    bool has_members (false); -    if (String members = u["memberTypes"]) +    if (String members = trim (u["memberTypes"]))      {        // Don't bother trying to resolve member types at this point        // since the order is important so we would have to insert        // the late resolutions into specific places. It is simpler        // to just do the whole resolution later.        // -      const WideChar* data (members.c_str ()); -      Size size (members.size ()); +      const wchar_t* data (members.c_str ()); +      size_t size (members.size ());        UnionMemberTypes* m (0);        // Traverse the type list while logically collapsing spaces.        // -      for (Size i (find_ns (data, size, 0)); i != String::npos;) +      for (size_t i (find_ns (data, size, 0)); i != String::npos;)        {          String s; -        Size j (find_s (data, size, i)); +        size_t j (find_s (data, size, i));          if (j != String::npos)          { @@ -2985,7 +3010,7 @@ namespace XSDFrontend        valid_ = false;      } -    if (String name = t["name"]) +    if (String name = trim (t["name"]))        s_->new_edge<Names> (scope (), node, name);      return &node; @@ -2994,7 +3019,7 @@ namespace XSDFrontend    Type* Parser::Impl::    restriction (XML::Element const& r, XML::Element const& t)    { -    String base (r["base"]); +    String base (trim (r["base"]));      Type* base_type (0);      if (base) @@ -3009,7 +3034,7 @@ namespace XSDFrontend      annotation (false); -    Boolean enum_ (false); +    bool enum_ (false);      if (!base)      { @@ -3051,6 +3076,7 @@ namespace XSDFrontend      Facets facets;      Restricts* restricts (0); +    String pattern;      while (more ())      { @@ -3077,7 +3103,7 @@ namespace XSDFrontend            else              restricts = set_type<Restricts> (base, r, node); -          if (String name = t["name"]) +          if (String name = trim (t["name"]))              s_->new_edge<Names> (scope (), static_cast<Nameable&> (node), name);            rv = &node; @@ -3094,10 +3120,16 @@ namespace XSDFrontend                 name == L"length" ||                 name == L"minLength" ||                 name == L"maxLength" || -               name == L"whiteSpace" || -               name == L"pattern") +               name == L"whiteSpace") +      { +        facets[name] = trim (e["value"]); +      } +      else if (name == L"pattern")        { -        facets[name] = e["value"]; +        if (pattern) +          pattern += L'|'; + +        pattern += e["value"];        }        else        { @@ -3109,6 +3141,9 @@ namespace XSDFrontend        }      } +    if (pattern) +      facets[L"pattern"] = pattern; +      if (enum_)        pop_scope ();      else @@ -3120,7 +3155,7 @@ namespace XSDFrontend        else          restricts = set_type<Restricts> (base, r, node); -      if (String name = t["name"]) +      if (String name = trim (t["name"]))          s_->new_edge<Names> (scope (), node, name);        rv = &node; @@ -3139,7 +3174,7 @@ namespace XSDFrontend      return rv;    } -  Void Parser::Impl:: +  void Parser::Impl::    enumeration (XML::Element const& e)    {      String value (e["value"]); @@ -3169,9 +3204,10 @@ namespace XSDFrontend      Complex& node (s_->new_node<Complex> (file (), t.line (), t.column ())); -    node.mixed_p (t["mixed"] == L"true" || t["mixed"] == L"1"); +    if (String m = trim (t["mixed"])) +      node.mixed_p (m == L"true" || m == L"1"); -    if (String name = t["name"]) +    if (String name = trim (t["name"]))        s_->new_edge<Names> (scope (), node, name);      r = &node; @@ -3211,8 +3247,14 @@ namespace XSDFrontend          }          if (c) -          s_->new_edge<ContainsCompositor> ( -            node, *c, parse_min (e["minOccurs"]), parse_max (e["maxOccurs"])); +        { +          unsigned long min (parse_min (trim (e["minOccurs"]))); +          unsigned long max (parse_max (trim (e["maxOccurs"]))); + +          if (!(min == 0 && max == 0)) +            s_->new_edge<ContainsCompositor> ( +              node, *c, min, max == unbounded ? 0 : max); +        }          while (more ())          { @@ -3277,15 +3319,18 @@ namespace XSDFrontend    }    Choice* Parser::Impl:: -  choice (XML::Element const& c, Boolean in_compositor) +  choice (XML::Element const& c, bool in_compositor)    {      Choice& node (s_->new_node<Choice> (file (), c.line (), c.column ()));      if (in_compositor)      { -      s_->new_edge<ContainsParticle> ( -        compositor (), node, -        parse_min (c["minOccurs"]), parse_max (c["maxOccurs"])); +      unsigned long min (parse_min (trim (c["minOccurs"]))); +      unsigned long max (parse_max (trim (c["maxOccurs"]))); + +      if (!(min == 0 && max == 0)) +        s_->new_edge<ContainsParticle> ( +          compositor (), node, min, max == unbounded ? 0 : max);      }      push_compositor (node); @@ -3321,15 +3366,18 @@ namespace XSDFrontend    }    Sequence* Parser::Impl:: -  sequence (XML::Element const& s, Boolean in_compositor) +  sequence (XML::Element const& s, bool in_compositor)    {      Sequence& node (s_->new_node<Sequence> (file (), s.line (), s.column ()));      if (in_compositor)      { -      s_->new_edge<ContainsParticle> ( -        compositor (), node, -        parse_min (s["minOccurs"]), parse_max (s["maxOccurs"])); +      unsigned long min (parse_min (trim (s["minOccurs"]))); +      unsigned long max (parse_max (trim (s["maxOccurs"]))); + +      if (!(min == 0 && max == 0)) +        s_->new_edge<ContainsParticle> ( +          compositor (), node, min, max == unbounded ? 0 : max);      }      push_compositor (node); @@ -3364,7 +3412,7 @@ namespace XSDFrontend      return &node;    } -  Void Parser::Impl:: +  void Parser::Impl::    simple_content (XML::Element const& c)    {      push (c); @@ -3387,13 +3435,11 @@ namespace XSDFrontend      pop ();    } -  Void Parser::Impl:: +  void Parser::Impl::    complex_content (XML::Element const& c, Complex& type)    { -    if (c.attribute_p ("mixed")) -    { -      type.mixed_p (c["mixed"] == L"true" || c["mixed"] == L"1"); -    } +    if (String m = trim (c["mixed"])) +      type.mixed_p (m == L"true" || m == L"1");      push (c); @@ -3415,13 +3461,13 @@ namespace XSDFrontend      pop ();    } -  Void Parser::Impl:: +  void Parser::Impl::    simple_content_extension (XML::Element const& e)    {      if (trace_)        wcout << "extension base: " << fq_name (e, e["base"]) << endl; -    set_type<Extends> (e["base"], e, dynamic_cast<Complex&> (scope ())); +    set_type<Extends> (trim (e["base"]), e, dynamic_cast<Complex&> (scope ()));      push (e); @@ -3447,11 +3493,10 @@ namespace XSDFrontend      pop ();    } -  Void Parser::Impl:: +  void Parser::Impl::    simple_content_restriction (XML::Element const& r)    { -    String base (r["base"]); -    Type* base_type (0); +    String base (trim (r["base"]));      if (trace_ && base)        wcout << "restriction base: " << fq_name (r, base) << endl; @@ -3471,7 +3516,7 @@ namespace XSDFrontend          if (trace_)            wcout << name << endl; -        if (name == L"simpleType")  base_type = simple_type (e); else +        if (name == L"simpleType") simple_type (e); else          {            wcerr << file () << ":" << e.line () << ":" << e.column () << ": "                  << "error: expected 'simpleType' instead of " @@ -3497,6 +3542,7 @@ namespace XSDFrontend      }      Facets facets; +    String pattern;      while (more ())      { @@ -3532,10 +3578,16 @@ namespace XSDFrontend                 name == L"length" ||                 name == L"minLength" ||                 name == L"maxLength" || -               name == L"whiteSpace" || -               name == L"pattern") +               name == L"whiteSpace") +      { +        facets[name] = trim (e["value"]); +      } +      else if (name == L"pattern")        { -        facets[name] = e["value"]; +        if (pattern) +          pattern += L'|'; + +        pattern += e["value"];        }        else if (name == L"attribute")        { @@ -3562,6 +3614,9 @@ namespace XSDFrontend        }      } +    if (pattern) +      facets[L"pattern"] = pattern; +      Complex& type (dynamic_cast<Complex&> (scope ()));      Restricts* restricts = set_type<Restricts> (base, r, type); @@ -3576,13 +3631,13 @@ namespace XSDFrontend      pop ();    } -  Void Parser::Impl:: +  void Parser::Impl::    complex_content_extension (XML::Element const& e, Complex& type)    {      if (trace_)        wcout << "extension base: " << fq_name (e, e["base"]) << endl; -    set_type<Extends> (e["base"], e, dynamic_cast<Complex&> (scope ())); +    set_type<Extends> (trim (e["base"]), e, dynamic_cast<Complex&> (scope ()));      push (e); @@ -3609,8 +3664,14 @@ namespace XSDFrontend        }        if (c) -        s_->new_edge<ContainsCompositor> ( -          type, *c, parse_min (e["minOccurs"]), parse_max (e["maxOccurs"])); +      { +        unsigned long min (parse_min (trim (e["minOccurs"]))); +        unsigned long max (parse_max (trim (e["maxOccurs"]))); + +        if (!(min == 0 && max == 0)) +          s_->new_edge<ContainsCompositor> ( +            type, *c, min, max == unbounded ? 0 : max); +      }        while (more ())        { @@ -3633,13 +3694,16 @@ namespace XSDFrontend      pop ();    } -  Void Parser::Impl:: +  void Parser::Impl::    complex_content_restriction (XML::Element const& e, Complex& type)    {      if (trace_)        wcout << "restriction base: " << fq_name (e, e["base"]) << endl; -    set_type<Restricts> (e["base"], e, dynamic_cast<Complex&> (scope ())); +    set_type<Restricts> ( +      trim (e["base"]), +      e, +      dynamic_cast<Complex&> (scope ()));      // @@      // For now we simply skip the contents unless the base is anyType @@ -3650,7 +3714,7 @@ namespace XSDFrontend      //      if (!proper_restriction_)      { -      String base (e["base"]); +      String base (trim (e["base"]));        String uq_name (unqualified_name (base));        String ns_name (namespace_name (e, base)); @@ -3683,8 +3747,14 @@ namespace XSDFrontend        }        if (c) -        s_->new_edge<ContainsCompositor> ( -          type, *c, parse_min (e["minOccurs"]), parse_max (e["maxOccurs"])); +      { +        unsigned long min (parse_min (trim (e["minOccurs"]))); +        unsigned long max (parse_max (trim (e["maxOccurs"]))); + +        if (!(min == 0 && max == 0)) +          s_->new_edge<ContainsCompositor> ( +            type, *c, min, max == unbounded ? 0 : max); +      }        while (more ())        { @@ -3707,18 +3777,18 @@ namespace XSDFrontend      pop ();    } -  Void Parser::Impl:: -  element (XML::Element const& e, Boolean global) +  void Parser::Impl:: +  element (XML::Element const& e, bool global)    { -    Boolean qualified (global ? true : qualify_element_); +    bool qualified (global ? true : qualify_element_); -    if (String form = e["form"]) +    if (String form = trim (e["form"]))        qualified = form == L"qualified";      if (trace_)        wcout << "element qualified: " << qualified << endl; -    if (String name = e["name"]) +    if (String name = trim (e["name"]))      {        if (trace_)          wcout << "element name '" << name << "'" << endl; @@ -3727,17 +3797,24 @@ namespace XSDFrontend          s_->new_node<Element> (            file (), e.line (), e.column (), global, qualified)); -      s_->new_edge<Names> (scope (), node, name); - -      if (qualified) -        s_->new_edge<BelongsToNamespace> (node, cur_ns ()); -        if (!global)        { -        s_->new_edge<ContainsParticle> ( -          compositor (), node, -          parse_min (e["minOccurs"]), parse_max (e["maxOccurs"])); +        unsigned long min (parse_min (trim (e["minOccurs"]))); +        unsigned long max (parse_max (trim (e["maxOccurs"]))); + +        if (!(min == 0 && max == 0)) +        { +          s_->new_edge<Names> (scope (), node, name); + +          s_->new_edge<ContainsParticle> ( +            compositor (), node, min, max == unbounded ? 0 : max); +        }        } +      else +        s_->new_edge<Names> (scope (), node, name); + +      if (qualified) +        s_->new_edge<BelongsToNamespace> (node, cur_ns ());        // Default and fixed values are mutually exclusive.        // @@ -3752,13 +3829,16 @@ namespace XSDFrontend          default_values_.push_back (&node);        } +      bool subst (false);        if (global)        { -        if (String sg = e["substitutionGroup"]) +        if (String sg = trim (e["substitutionGroup"]))          {            if (trace_)              wcout << "substitutes " << sg << endl; +          subst = true; +            try            {              String uq_name (unqualified_name (sg)); @@ -3778,7 +3858,7 @@ namespace XSDFrontend          }        } -      if (String type = e["type"]) +      if (String type = trim (e["type"]))        {          if (trace_)            wcout << "element type " << fq_name (e, type) << endl; @@ -3827,10 +3907,12 @@ namespace XSDFrontend            if (t)              s_->new_edge<Belongs> (node, *t);          } -        else +        // By default the type is anyType unless this element is a +        // member of a substitution group, in which case it has the +        // same type as the element it substiutes. +        // +        else if (!subst)          { -          // anyType -          //            if (!is_disabled ("F001"))            {              wcerr << file () << ":" << e.line () << ":" << e.column () << ": " @@ -3851,18 +3933,14 @@ namespace XSDFrontend          pop ();        }      } -    else if (String ref = e["ref"]) +    else if (String ref = trim (e["ref"]))      {        Element& node (          s_->new_node<Element> (            file (), e.line (), e.column (), true, true)); -      // Ref can only be in compositor. -      // -      s_->new_edge<ContainsParticle> ( -        compositor (), node, -        parse_min (e["minOccurs"]), parse_max (e["maxOccurs"])); - +      unsigned long min (parse_min (trim (e["minOccurs"]))); +      unsigned long max (parse_max (trim (e["maxOccurs"])));        // Default and fixed values are mutually exclusive.        // @@ -3886,119 +3964,127 @@ namespace XSDFrontend        pop (); -      // Try to resolve the prototype. -      // -      try +      if (!(min == 0 && max == 0))        { -        String uq_name (unqualified_name (ref)); -        String ns_name (namespace_name (e, ref)); - -        s_->new_edge<Names> (scope (), node, uq_name); - -        Element& prot (resolve<Element> (ns_name, uq_name, *s_, *cache_)); -        s_->new_edge<BelongsToNamespace> (node, prot.namespace_ ()); +        // Ref can only be in compositor. +        // +        s_->new_edge<ContainsParticle> ( +          compositor (), node, min, max == unbounded ? 0 : max); -        // Copy substitution group information if any. +        // Try to resolve the prototype.          // -        if (prot.context ().count ("substitution-ns-name")) +        try          { -          node.context ().set ( -            "substitution-ns-name", -            prot.context ().get<String> ("substitution-ns-name")); +          String uq_name (unqualified_name (ref)); +          String ns_name (namespace_name (e, ref)); -          node.context ().set ( -            "substitution-uq-name", -            prot.context ().get<String> ("substitution-uq-name")); -        } +          s_->new_edge<Names> (scope (), node, uq_name); -        // Transfer default and fixed values if the ref declaration hasn't -        // defined its own. -        // -        if (!node.default_p ()) -        { -          if (prot.fixed_p ()) -            node.fixed (prot.value ()); -          else if (prot.default_p ()) -            node.default_ (prot.value ()); +          Element& prot (resolve<Element> (ns_name, uq_name, *s_, *cache_)); +          s_->new_edge<BelongsToNamespace> (node, prot.namespace_ ()); -          if (node.default_p ()) +          // Copy substitution group information if any. +          // +          if (prot.context ().count ("substitution-ns-name"))            {              node.context ().set ( -              "dom-node", -              prot.context ().get<Xerces::DOMElement*> ("dom-node")); -            default_values_.push_back (&node); +              "substitution-ns-name", +              prot.context ().get<String> ("substitution-ns-name")); + +            node.context ().set ( +              "substitution-uq-name", +              prot.context ().get<String> ("substitution-uq-name"));            } -        } -        // Transfer annotation if the ref declaration hasn't defined its own. -        // -        if (!node.annotated_p () && prot.annotated_p ()) -          s_->new_edge<Annotates> (prot.annotation (), node); +          // Transfer default and fixed values if the ref declaration hasn't +          // defined its own. +          // +          if (!node.default_p ()) +          { +            if (prot.fixed_p ()) +              node.fixed (prot.value ()); +            else if (prot.default_p ()) +              node.default_ (prot.value ()); -        // Set type information. -        // -        if (prot.typed_p ()) -        { -          s_->new_edge<Belongs> (node, prot.type ()); +            if (node.default_p ()) +            { +              node.context ().set ( +                "dom-node", +                prot.context ().get<Xerces::DOMElement*> ("dom-node")); +              default_values_.push_back (&node); +            } +          } + +          // Transfer annotation if the ref declaration hasn't defined its own. +          // +          if (!node.annotated_p () && prot.annotated_p ()) +            s_->new_edge<Annotates> (prot.annotation (), node); + +          // Set type information. +          // +          if (prot.typed_p ()) +          { +            s_->new_edge<Belongs> (node, prot.type ()); +          } +          else if (prot.context ().count ("type-ns-name")) +          { +            String ns_name (prot.context ().get<String> ("type-ns-name")); +            String uq_name (prot.context ().get<String> ("type-uq-name")); + +            node.context ().set ("type-ns-name", ns_name); +            node.context ().set ("type-uq-name", uq_name); +            node.context ().set ("edge-type-id", type_id (typeid (Belongs))); + +            if (trace_) +              wcout << "element '" << ref << "' is not typed" << endl +                    << "deferring resolution until later" << endl; +          } +          else +          { +            // This could be a recursive reference to an element who's +            // (anonymous) type is being defined. We are going to let +            // resolver sort out this case. +            // +            node.context ().set ("instance-ns-name", ns_name); +            node.context ().set ("instance-uq-name", uq_name); + +            if (trace_) +              wcout << "looks like a recursive reference to an element '" +                    << ns_name << "#" << uq_name << "' which is being " +                    << "defined" << endl +                    << "deferring resolution until later" << endl; +          }          } -        else if (prot.context ().count ("type-ns-name")) +        catch (NotNamespace const& ex)          { -          String ns_name (prot.context ().get<String> ("type-ns-name")); -          String uq_name (prot.context ().get<String> ("type-uq-name")); - -          node.context ().set ("type-ns-name", ns_name); -          node.context ().set ("type-uq-name", uq_name); -          node.context ().set ("edge-type-id", TypeId (typeid (Belongs))); +          if (valid_) +          { +            wcerr << file () << ":" << e.line () << ":" << e.column () << ": " +                  << "ice: unable to resolve namespace '" << ex.ns () << "'" +                  << endl; -          if (trace_) -            wcout << "element '" << ref << "' is not typed" << endl -                  << "deferring resolution until later" << endl; +            abort (); +          }          } -        else +        catch (NotName const& ex)          { -          // This could be a recursive reference to an element who's -          // (anonymous) type is being defined. We are going to let -          // resolver sort out this case. -          // -          node.context ().set ("instance-ns-name", ns_name); -          node.context ().set ("instance-uq-name", uq_name); +          node.context ().set ("instance-ns-name", ex.ns ()); +          node.context ().set ("instance-uq-name", ex.name ());            if (trace_) -            wcout << "looks like a recursive reference to an element '" -                  << ns_name << "#" << uq_name << "' which is being " -                  << "defined" << endl +            wcout << "unable to resolve name '" << ex.name () +                  << "' inside namespace '" << ex.ns () << "'" << endl                    << "deferring resolution until later" << endl;          } -      } -      catch (NotNamespace const& ex) -      { -        if (valid_) +        catch (XML::NoMapping const& ex)          {            wcerr << file () << ":" << e.line () << ":" << e.column () << ": " -                << "ice: unable to resolve namespace '" << ex.ns () << "'" -                << endl; +                << "error: unable to resolve namespace prefix '" +                << ex.prefix () << "' in '" << ref << "'" << endl; -          abort (); +          valid_ = false;          }        } -      catch (NotName const& ex) -      { -        node.context ().set ("instance-ns-name", ex.ns ()); -        node.context ().set ("instance-uq-name", ex.name ()); - -        if (trace_) -          wcout << "unable to resolve name '" << ex.name () -                << "' inside namespace '" << ex.ns () << "'" << endl -                << "deferring resolution until later" << endl; -      } -      catch (XML::NoMapping const& ex) -      { -        wcerr << file () << ":" << e.line () << ":" << e.column () << ": " -              << "error: unable to resolve namespace prefix '" -              << ex.prefix () << "' in '" << ref << "'" << endl; - -        valid_ = false; -      }      }      else      { @@ -4012,7 +4098,7 @@ namespace XSDFrontend    }    SemanticGraph::Annotation* Parser::Impl:: -  annotation (Boolean process) +  annotation (bool process)    {      Annotation* r (0); @@ -4039,7 +4125,7 @@ namespace XSDFrontend                // Use first non-structured (text only) documentation element.                //                String text; -              Boolean struc (false); +              bool struc (false);                DOMElement* de (doc.dom_element());                for (DOMNode* n (de->getFirstChild ()); @@ -4085,24 +4171,24 @@ namespace XSDFrontend    } -  Void Parser::Impl:: -  attribute (XML::Element const& a, Boolean global) +  void Parser::Impl:: +  attribute (XML::Element const& a, bool global)    { -    Boolean optional (true); +    bool optional (true); -    String use (a["use"]); +    String use (trim (a["use"]));      if (use == L"prohibited")        return;      else if (use == L"required")        optional = false; -    Boolean qualified (global ? true : qualify_attribute_); +    bool qualified (global ? true : qualify_attribute_); -    if (String form = a["form"]) +    if (String form = trim (a["form"]))        qualified = form == L"qualified"; -    if (String name = a["name"]) +    if (String name = trim (a["name"]))      {        if (trace_)          wcout << "attribute '" << name << "'" << endl; @@ -4130,7 +4216,7 @@ namespace XSDFrontend          default_values_.push_back (&node);        } -      if (String type = a["type"]) +      if (String type = trim (a["type"]))        {          if (trace_)            wcout << "attribute type: '" << fq_name (a, type) << "'" << endl; @@ -4202,7 +4288,7 @@ namespace XSDFrontend          pop ();        }      } -    else if (String ref = a["ref"]) +    else if (String ref = trim (a["ref"]))      {        Attribute& node (          s_->new_node<Attribute> ( @@ -4280,7 +4366,7 @@ namespace XSDFrontend            node.context ().set ("type-ns-name", ns_name);            node.context ().set ("type-uq-name", uq_name); -          node.context ().set ("edge-type-id", TypeId (typeid (Belongs))); +          node.context ().set ("edge-type-id", type_id (typeid (Belongs)));            if (trace_)              wcout << "attribute '" << ref << "' is not typed" << endl @@ -4342,10 +4428,10 @@ namespace XSDFrontend      }    } -  Void Parser::Impl:: +  void Parser::Impl::    attribute_group (XML::Element const& g)    { -    if (String name = g["name"]) +    if (String name = trim (g["name"]))      {        // Global definition.        // @@ -4384,7 +4470,7 @@ namespace XSDFrontend        pop ();        pop_scope ();      } -    else if (String ref = g["ref"]) +    else if (String ref = trim (g["ref"]))      {        if (trace_)          wcout << "attribute-group-ref " << ref << endl; @@ -4441,20 +4527,22 @@ namespace XSDFrontend      }    } -  Void Parser::Impl:: +  void Parser::Impl::    any (XML::Element const& a)    {      if (trace_)        wcout << "any" << endl; -    String namespaces (a["namespace"] ? a["namespace"] : L"##any"); +    String namespaces (trim (a["namespace"])); + +    if (!namespaces) +      namespaces = L"##any";      Any& any (        s_->new_node<Any> (file (), a.line (), a.column (), namespaces)); -    s_->new_edge<ContainsParticle> ( -      compositor (), any, -      parse_min (a["minOccurs"]), parse_max (a["maxOccurs"])); +    unsigned long min (parse_min (trim (a["minOccurs"]))); +    unsigned long max (parse_max (trim (a["maxOccurs"])));      // Parse annotation.      // @@ -4465,33 +4553,42 @@ namespace XSDFrontend      pop (); -    // Any has no name so we have to come up with a fake one in order to -    // put it into the scope. -    // -    UnsignedLong count; -    FrontendElements::Context& ctx (scope ().context ()); - -    if (!ctx.count ("any-name-count")) +    if (!(min == 0 && max == 0))      { -      count = 0; -      ctx.set ("any-name-count", count); -    } -    else -      count = ++(ctx.get<UnsignedLong> ("any-name-count")); +      s_->new_edge<ContainsParticle> ( +        compositor (), any, min, max == unbounded ? 0 : max); -    std::basic_ostringstream<WideChar> os; -    os << "any #" << count; +      // Any has no name so we have to come up with a fake one in order to +      // put it into the scope. +      // +      unsigned long count; +      SemanticGraph::Context& ctx (scope ().context ()); -    s_->new_edge<Names> (scope (), any, os.str ()); +      if (!ctx.count ("any-name-count")) +      { +        count = 0; +        ctx.set ("any-name-count", count); +      } +      else +        count = ++(ctx.get<unsigned long> ("any-name-count")); + +      std::basic_ostringstream<wchar_t> os; +      os << "any #" << count; + +      s_->new_edge<Names> (scope (), any, os.str ()); +    }    } -  Void Parser::Impl:: +  void Parser::Impl::    any_attribute (XML::Element const& a)    {      if (trace_)        wcout << "anyAttribute" << endl; -    String namespaces (a["namespace"] ? a["namespace"] : L"##any"); +    String namespaces (trim (a["namespace"])); + +    if (!namespaces) +      namespaces = L"##any";      AnyAttribute& any (        s_->new_node<AnyAttribute> ( @@ -4510,8 +4607,8 @@ namespace XSDFrontend      // in order to put it into the scope.      // -    UnsignedLong count; -    FrontendElements::Context& ctx (scope ().context ()); +    unsigned long count; +    SemanticGraph::Context& ctx (scope ().context ());      if (!ctx.count ("any-attribute-name-count"))      { @@ -4519,9 +4616,9 @@ namespace XSDFrontend        ctx.set ("any-attribute-name-count", count);      }      else -      count = ++(ctx.get<UnsignedLong> ("any-attribute-name-count")); +      count = ++(ctx.get<unsigned long> ("any-attribute-name-count")); -    std::basic_ostringstream<WideChar> os; +    std::basic_ostringstream<wchar_t> os;      os << "any-attribute #" << count;      s_->new_edge<Names> (scope (), any, os.str ()); @@ -4573,7 +4670,7 @@ namespace XSDFrontend        {          // See if we've got 'xse:refType' attribute.          // -        if (String ref_type = e.attribute (xse, "refType")) +        if (String ref_type = trim (e.attribute (xse, "refType")))          {            if (trace_)              wcout << "found refType attribute '" << ref_type << "'" << endl; @@ -4618,7 +4715,7 @@ namespace XSDFrontend      {        node.context ().set ("type-ns-name", ex.ns ());        node.context ().set ("type-uq-name", ex.name ()); -      node.context ().set ("edge-type-id", TypeId (typeid (Edge))); +      node.context ().set ("edge-type-id", type_id (typeid (Edge)));        if (trace_)          wcout << "unable to resolve name '" << ex.name () @@ -4641,14 +4738,16 @@ namespace XSDFrontend    // that can later be used in diagnostics. Unfortunately, it doesn't    // work. So we will have to keep our own track.    // -  struct Context: public NonCopyable +  struct Context    { +    Context () {} +      // File map for diagnostic.      //      Path const&      file (Path const& abs) const      { -      FileMap::ConstIterator i (file_map_.find (abs)); +      FileMap::const_iterator i (file_map_.find (abs));        if (i != file_map_.end ())        { @@ -4660,14 +4759,18 @@ namespace XSDFrontend        }      } -    Void +    void      map_file (Path const& abs, Path const& rel)      {        file_map_[abs] = rel;      }    private: -    typedef Cult::Containers::Map<Path, Path, FilePathComparator> FileMap; +    Context (Context const&); +    Context& operator= (Context const&); + +  private: +    typedef std::map<Path, Path> FileMap;      FileMap file_map_;    }; @@ -4676,13 +4779,13 @@ namespace XSDFrontend    class ErrorHandler : public  Xerces::DOMErrorHandler    {    public: -    ErrorHandler (Boolean& valid, XSDFrontend::Context const& ctx) +    ErrorHandler (bool& valid, XSDFrontend::Context const& ctx)          : valid_ (valid),            ctx_ (ctx)      {      } -    virtual Boolean +    virtual bool      handleError (Xerces::DOMError const& e)      {        // Xerces likes to say "Fatal error encountered during schema scan". @@ -4694,14 +4797,8 @@ namespace XSDFrontend          return true; -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -      XSDFrontend::SemanticGraph::Path abs_path ( -        XML::transcode_to_narrow (e.getLocation ()->getURI ()), -        boost::filesystem::native); -#else        XSDFrontend::SemanticGraph::Path abs_path ( -        XML::transcode_to_narrow (e.getLocation ()->getURI ()).c_str()); -#endif +        XML::transcode_to_narrow (e.getLocation ()->getURI ()));        XSDFrontend::SemanticGraph::Path rel_path (ctx_.file (abs_path)); @@ -4730,7 +4827,7 @@ namespace XSDFrontend      }    private: -    Boolean& valid_; +    bool& valid_;      XSDFrontend::Context const& ctx_;    }; @@ -4754,12 +4851,7 @@ namespace XSDFrontend            base_ (base),            ctx_ (ctx)      { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -      setSystemId (XML::XMLChString ( -                     String (abs_.native_file_string ())).c_str ()); -#else        setSystemId (XML::XMLChString (String (abs_.string ())).c_str ()); -#endif      }      virtual Xerces::BinInputStream* @@ -4794,11 +4886,7 @@ namespace XSDFrontend    class EntityResolver: public Xerces::XMemory, -#if _XERCES_VERSION >= 30000                          public Xerces::DOMLSResourceResolver -#else -                        public Xerces::DOMEntityResolver -#endif    {    public:      EntityResolver (XSDFrontend::Context& ctx, LocationTranslator* t) @@ -4806,19 +4894,12 @@ namespace XSDFrontend      {      } -#if _XERCES_VERSION >= 30000      virtual Xerces::DOMLSInput*      resolveResource(XMLCh const* const,                      XMLCh const* const,                      XMLCh const* const /*pub_id*/,                      XMLCh const* const prv_id,                      XMLCh const* const base_uri) -#else -    virtual Xerces::DOMInputSource* -    resolveEntity (XMLCh const* const /*pub_id*/, -                   XMLCh const* const prv_id, -                   XMLCh const* const base_uri) -#endif      {        /*        XMLCh empty[1]; @@ -4832,12 +4913,7 @@ namespace XSDFrontend        // base_uri should be a valid path by now.        // -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -      Path base (XML::transcode_to_narrow (base_uri), -                 boost::filesystem::native); -#else -      Path base (XML::transcode_to_narrow (base_uri).c_str()); -#endif +      Path base (XML::transcode_to_narrow (base_uri));        if (prv_id == 0)        { @@ -4861,36 +4937,19 @@ namespace XSDFrontend        try        { -        Path path; - -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -        try -        { -          path = Path (path_str); -        } -        catch (InvalidPath const&) -        { -          // Retry as a native path. -          // -          path = Path (path_str, boost::filesystem::native); -        } -#else -      // The new ABI does not have a fallback native representation -      path = Path (path_str.c_str()); -#endif - -        Path base_dir (base.branch_path ()); +        Path path (path_str); +        Path base_dir (base.directory ());          Path abs_path, rel_path; -        if (path.is_complete ()) +        if (path.absolute ())          {            abs_path = rel_path = path;          }          else          {            abs_path = base_dir / path; -          rel_path = ctx_.file (base).branch_path () / path; +          rel_path = ctx_.file (base).directory () / path;          }          abs_path.normalize (); @@ -4928,7 +4987,7 @@ namespace XSDFrontend    XML::AutoPtr<Xerces::DOMDocument> Parser::Impl:: -  dom (Path const& tu, Boolean validate) +  dom (Path const& tu, bool validate)    {      using namespace Xerces; @@ -4936,8 +4995,11 @@ namespace XSDFrontend      {        XSDFrontend::Context ctx; -      Path abs_path (system_complete (tu)); -      abs_path.normalize (); +      // Do normalize() before complete() to avoid hitting system path +      // limits with '..' directories. +      // +      Path abs_path (tu); +      abs_path.normalize ().complete ();        ctx.map_file (abs_path, tu);        InputSource input_source (abs_path, tu, abs_path, ctx); @@ -4958,7 +5020,6 @@ namespace XSDFrontend          // Create a DOMBuilder.          // -#if _XERCES_VERSION >= 30000          XML::AutoPtr<DOMLSParser> parser (            impl->createLSParser (DOMImplementationLS::MODE_SYNCHRONOUS, 0)); @@ -4990,29 +5051,6 @@ namespace XSDFrontend          Wrapper4InputSource wrap (&input_source, false);          parser->loadGrammar (&wrap, Grammar::SchemaGrammarType); -#else -        XML::AutoPtr<DOMBuilder> parser ( -          impl->createDOMBuilder (DOMImplementationLS::MODE_SYNCHRONOUS, 0)); - -        parser->setFeature (XMLUni::fgDOMComments, false); -        parser->setFeature (XMLUni::fgDOMDatatypeNormalization, true); -        parser->setFeature (XMLUni::fgDOMEntities, false); -        parser->setFeature (XMLUni::fgDOMNamespaces, true); -        parser->setFeature (XMLUni::fgDOMValidation, true); -        parser->setFeature (XMLUni::fgDOMWhitespaceInElementContent, false); -        parser->setFeature (XMLUni::fgXercesSchema, true); -        parser->setFeature (XMLUni::fgXercesSchemaFullChecking, full_schema_check_); -        parser->setFeature (XMLUni::fgXercesValidationErrorAsFatal, true); - -        ErrorHandler eh (valid_, ctx); -        parser->setErrorHandler (&eh); - -        EntityResolver er (ctx, loc_translator_); -        parser->setEntityResolver (&er); - -        Wrapper4InputSource wrap (&input_source, false); -        parser->loadGrammar (wrap, Grammar::SchemaGrammarType); -#endif        }        if (!valid_) @@ -5038,7 +5076,7 @@ namespace XSDFrontend      }      catch (Xerces::DOMException const& e)      { -      Size const size = 2047; +      size_t const size = 2047;        XMLCh text[size + 1];        wcerr << tu << ": ice: Xerces::DOMException: "; @@ -5081,9 +5119,9 @@ namespace XSDFrontend    }    Parser:: -  Parser (Boolean proper_restriction, -          Boolean multiple_imports, -          Boolean full_schema_check) +  Parser (bool proper_restriction, +          bool multiple_imports, +          bool full_schema_check)        : impl_ (new Impl (proper_restriction,                           multiple_imports,                           full_schema_check, @@ -5093,9 +5131,9 @@ namespace XSDFrontend    }    Parser:: -  Parser (Boolean proper_restriction, -          Boolean multiple_imports, -          Boolean full_schema_check, +  Parser (bool proper_restriction, +          bool multiple_imports, +          bool full_schema_check,            LocationTranslator& t,            const WarningSet& d)        : impl_ (new Impl (proper_restriction, @@ -5106,19 +5144,19 @@ namespace XSDFrontend    {    } -  Evptr<SemanticGraph::Schema> Parser:: +  auto_ptr<SemanticGraph::Schema> Parser::    parse (SemanticGraph::Path const& path)    {      return impl_->parse (path);    } -  Evptr<SemanticGraph::Schema> Parser:: +  auto_ptr<SemanticGraph::Schema> Parser::    parse (SemanticGraph::Paths const& paths)    {      return impl_->parse (paths);    } -  Evptr<SemanticGraph::Schema> Parser:: +  auto_ptr<SemanticGraph::Schema> Parser::    xml_schema (SemanticGraph::Path const& path)    {      return impl_->xml_schema (path); diff --git a/libxsd-frontend/xsd-frontend/parser.hxx b/libxsd-frontend/xsd-frontend/parser.hxx index ac0ff4d..746aa97 100644 --- a/libxsd-frontend/xsd-frontend/parser.hxx +++ b/libxsd-frontend/xsd-frontend/parser.hxx @@ -1,20 +1,18 @@  // file      : xsd-frontend/parser.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_PARSER_HXX  #define XSD_FRONTEND_PARSER_HXX -#include <cult/types.hxx> -#include <cult/containers/set.hxx> +#include <set> +#include <memory> // std::auto_ptr +#include <xsd-frontend/types.hxx>  #include <xsd-frontend/semantic-graph/schema.hxx>  namespace XSDFrontend  { -  using namespace Cult::Types; -    struct InvalidSchema {};    class LocationTranslator @@ -30,46 +28,50 @@ namespace XSDFrontend    // Set of disabled warning IDs. Special ID "all" disables all    // warnings.    // -  typedef Cult::Containers::Set<NarrowString> WarningSet; +  typedef std::set<NarrowString> WarningSet; -  class Parser: public NonCopyable +  class Parser    {    public:      ~Parser (); -    Parser (Boolean proper_restriction, -            Boolean multiple_imports, -            Boolean full_schema_check); +    Parser (bool proper_restriction, +            bool multiple_imports, +            bool full_schema_check); -    Parser (Boolean proper_restriction, -            Boolean multiple_imports, -            Boolean full_schema_check, +    Parser (bool proper_restriction, +            bool multiple_imports, +            bool full_schema_check,              LocationTranslator&,              const WarningSet& disabled); +  private: +    Parser (Parser const&); +    Parser& operator= (Parser const&); +    public:      // Parse a schema file. Throws InvalidSchema in case of a failure.      // -    Evptr<SemanticGraph::Schema> +    std::auto_ptr<SemanticGraph::Schema>      parse (SemanticGraph::Path const&);      // Parse a number of schema files all into one semantic graph.      // Each schema file is imported from an unnamed root translation      // unit. Throws InvalidSchema in case of a failure.      // -    Evptr<SemanticGraph::Schema> +    std::auto_ptr<SemanticGraph::Schema>      parse (SemanticGraph::Paths const&);      // Returns a schema graph that corresponds to the XML Schema      // namespace with built-in type definitions. The path is fake      // and is only used as a lable.      // -    Evptr<SemanticGraph::Schema> +    std::auto_ptr<SemanticGraph::Schema>      xml_schema (SemanticGraph::Path const&);    private:      class Impl; -    Evptr<Impl> impl_; +    std::auto_ptr<Impl> impl_;    };  } diff --git a/libxsd-frontend/xsd-frontend/schema-dom-parser.cxx b/libxsd-frontend/xsd-frontend/schema-dom-parser.cxx index 452980c..73a0f83 100644 --- a/libxsd-frontend/xsd-frontend/schema-dom-parser.cxx +++ b/libxsd-frontend/xsd-frontend/schema-dom-parser.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/schema-dom-parser.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/schema-dom-parser.hxx> @@ -44,11 +43,7 @@ namespace XSDFrontend                    const unsigned int url_id,                    const XMLCh* const prefix,                    const RefVectorOf<XMLAttr>& attributes, -#if _XERCES_VERSION >= 30000                    const XMLSize_t attr_count, -#else -                  const unsigned int attr_count, -#endif                    const bool empty,                    const bool root)      { @@ -77,18 +72,8 @@ namespace XSDFrontend        ReaderMgr::LastExtEntityInfo info;        ((ReaderMgr*) fScanner->getLocator())->getLastExtEntityInfo(info); -#if _XERCES_VERSION >= 30000        unsigned long l (static_cast<unsigned long> (info.lineNumber));        unsigned long c (static_cast<unsigned long> (info.colNumber)); -#else -      unsigned long l (info.lineNumber == -1 -                       ? 0UL -                       : static_cast<unsigned long> (info.lineNumber)); - -      unsigned long c (info.colNumber == -1 -                       ? 0UL -                       : static_cast<unsigned long> (info.colNumber)); -#endif        fCurrentNode->setUserData (line_key, reinterpret_cast<void*> (l), 0);        fCurrentNode->setUserData (column_key, reinterpret_cast<void*> (c), 0); @@ -124,11 +109,7 @@ namespace XSDFrontend      void SchemaDOMParser::      docCharacters (const XMLCh* const s, -#if _XERCES_VERSION >= 30000                     const XMLSize_t length, -#else -                   const unsigned int length, -#endif                     const bool cdata)      {        // Ignore chars outside of content. @@ -177,11 +158,7 @@ namespace XSDFrontend      void SchemaDOMParser::      ignorableWhitespace (const XMLCh* const s, -#if _XERCES_VERSION >= 30000                           const XMLSize_t length, -#else -                         const unsigned int length, -#endif                           const bool cdata)      {        // Ignore chars before the root element. diff --git a/libxsd-frontend/xsd-frontend/schema-dom-parser.hxx b/libxsd-frontend/xsd-frontend/schema-dom-parser.hxx index 7571677..344065a 100644 --- a/libxsd-frontend/xsd-frontend/schema-dom-parser.hxx +++ b/libxsd-frontend/xsd-frontend/schema-dom-parser.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/schema-dom-parser.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SCHEMA_DOM_PARSER_HXX @@ -13,6 +12,8 @@  #include <xercesc/validators/schema/XSDLocator.hpp>  #include <xercesc/validators/schema/XSDErrorReporter.hpp> +#include <xsd-frontend/version.hxx> // Check Xerces-C++ version. +  namespace XSDFrontend  {    namespace XML @@ -35,11 +36,7 @@ namespace XSDFrontend                      const unsigned int url_id,                      const XMLCh* const prefix,                      const Xerces::RefVectorOf<Xerces::XMLAttr>& attributes, -#if _XERCES_VERSION >= 30000                      const XMLSize_t attribute_count, -#else -                    const unsigned int attribute_count, -#endif                      const bool empty,                      const bool root); @@ -51,11 +48,7 @@ namespace XSDFrontend        virtual void        docCharacters (const XMLCh* const, -#if _XERCES_VERSION >= 30000                       const XMLSize_t length, -#else -                     const unsigned int length, -#endif                       const bool cdata);        virtual void @@ -69,11 +62,7 @@ namespace XSDFrontend        virtual void        ignorableWhitespace (const XMLCh* const, -#if _XERCES_VERSION >= 30000                             const XMLSize_t length, -#else -                           const unsigned int length, -#endif                             const bool cdata);      private:        SchemaDOMParser (SchemaDOMParser const&); diff --git a/libxsd-frontend/xsd-frontend/semantic-graph.hxx b/libxsd-frontend/xsd-frontend/semantic-graph.hxx index bee17fc..36d42c3 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_HXX diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/annotation.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/annotation.cxx index 22793f7..17a0f03 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/annotation.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/annotation.cxx @@ -1,19 +1,16 @@  // file      : xsd-frontend/semantic-graph/annotation.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/annotation.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; - +    using compiler::type_info;      // Annotates      // @@ -23,11 +20,10 @@ namespace XSDFrontend        {          AnnotatesInit ()          { -          TypeInfo ti (typeid (Annotates)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Annotates)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } annotates_init_;      } @@ -39,11 +35,10 @@ namespace XSDFrontend        {          AnnotationInit ()          { -          TypeInfo ti (typeid (Annotation)); -          ti.add_base (Access::public_, true, typeid (Node)); -          RTTI::insert (ti); +          type_info ti (typeid (Annotation)); +          ti.add_base (typeid (Node)); +          insert (ti);          } -        } annotation_init_;      }    } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/annotation.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/annotation.hxx index 661ac72..0464f4f 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/annotation.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/annotation.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/annotation.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ANNOTATION_HXX @@ -25,29 +24,20 @@ namespace XSDFrontend          return *annotation_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Annotates () -          : annotation_ (0) -      { -      } +    public: +      Annotates (): annotation_ (0) {} -      Void +      void        set_left_node (Annotation& a)        {          annotation_ = &a;        } -      Void -      set_right_node (Node&) -      { -      } +      void +      set_right_node (Node&) {} -      Void -      set_right_node (Edge&) -      { -      } +      void +      set_right_node (Edge&) {}      private:        Annotation* annotation_; @@ -58,30 +48,26 @@ namespace XSDFrontend      class Annotation: public virtual Node      {      public: -      WideString const& +      String const&        documentation () const        {          return documentation_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        Annotation (Path const& file, -                  UnsignedLong line, -                  UnsignedLong column, -                  WideString const& documentation) +                  unsigned long line, +                  unsigned long column, +                  String const& documentation)            : Node (file, line, column), documentation_ (documentation)        {        } -      Void -      add_edge_left (Annotates&) -      { -      } +      void +      add_edge_left (Annotates&) {}      private: -      WideString documentation_; +      String documentation_;      };    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/any-attribute.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/any-attribute.cxx index e25e742..19b9df2 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/any-attribute.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/any-attribute.cxx @@ -1,8 +1,9 @@  // file      : xsd-frontend/semantic-graph/any-attribute.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/any-attribute.hxx>  #include <xsd-frontend/semantic-graph/compositors.hxx> @@ -10,30 +11,11 @@ namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; - -    namespace -    { -      struct AnyAttributeInit -      { -        AnyAttributeInit () -        { -          TypeInfo ti (typeid (AnyAttribute)); -          ti.add_base (Access::public_, true, typeid (Nameable)); -          RTTI::insert (ti); -        } - -      } any_attribute_init_; -    } -      AnyAttribute::      AnyAttribute (Path const& file, -                  UnsignedLong line, -                  UnsignedLong column, -                  WideString const& namespaces) +                  unsigned long line, +                  unsigned long column, +                  String const& namespaces)          : Node (file, line, column),            prototype_ (0)      { @@ -41,11 +23,11 @@ namespace XSDFrontend        // chararcter.        // -      for (Size i (0), j (namespaces.find (L' '));;) +      for (size_t i (0), j (namespaces.find (L' '));;)        { -        if (j != WideString::npos) +        if (j != String::npos)          { -          namespaces_.push_back (WideString (namespaces, i, j - i)); +          namespaces_.push_back (String (namespaces, i, j - i));            i = j + 1;            j = namespaces.find (L' ', i); @@ -54,7 +36,7 @@ namespace XSDFrontend          {            // Last element.            // -          namespaces_.push_back (WideString (namespaces, i)); +          namespaces_.push_back (String (namespaces, i));            break;          }        } @@ -62,8 +44,8 @@ namespace XSDFrontend      AnyAttribute::      AnyAttribute (Path const& file, -                  UnsignedLong line, -                  UnsignedLong column, +                  unsigned long line, +                  unsigned long column,                    NamespaceIterator begin,                    NamespaceIterator end)          : Node (file, line, column), @@ -110,5 +92,20 @@ namespace XSDFrontend        return namespace_ (scope ());      } + +    namespace +    { +      using compiler::type_info; + +      struct AnyAttributeInit +      { +        AnyAttributeInit () +        { +          type_info ti (typeid (AnyAttribute)); +          ti.add_base (typeid (Nameable)); +          insert (ti); +        } +      } any_attribute_init_; +    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/any-attribute.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/any-attribute.hxx index bc8c512..bb3d761 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/any-attribute.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/any-attribute.hxx @@ -1,12 +1,11 @@  // file      : xsd-frontend/semantic-graph/any-attribute.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ANY_ATTRIBUTE_HXX  #define XSD_FRONTEND_SEMANTIC_GRAPH_ANY_ATTRIBUTE_HXX -#include <cult/containers/vector.hxx> +#include <vector>  #include <xsd-frontend/semantic-graph/elements.hxx>  #include <xsd-frontend/semantic-graph/namespace.hxx> @@ -17,12 +16,10 @@ namespace XSDFrontend    {      class AnyAttribute: public virtual Nameable      { -      typedef -      Cult::Containers::Vector<WideString> -      Namespaces; +      typedef std::vector<String> Namespaces;      public: -      typedef Namespaces::ConstIterator NamespaceIterator; +      typedef Namespaces::const_iterator NamespaceIterator;        NamespaceIterator        namespace_begin () const @@ -37,7 +34,7 @@ namespace XSDFrontend        }      public: -      Boolean +      bool        prototype_p ()        {          return prototype_ != 0; @@ -50,7 +47,7 @@ namespace XSDFrontend          return *prototype_;        } -      Void +      void        prototype (AnyAttribute& a)        {          assert (prototype_ == 0); @@ -61,17 +58,15 @@ namespace XSDFrontend        Namespace&        definition_namespace (); -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        AnyAttribute (Path const& file, -                    UnsignedLong line, -                    UnsignedLong column, -                    WideString const& namespaces); +                    unsigned long line, +                    unsigned long column, +                    String const& namespaces);        AnyAttribute (Path const& file, -                    UnsignedLong line, -                    UnsignedLong column, +                    unsigned long line, +                    unsigned long column,                      NamespaceIterator begin,                      NamespaceIterator end); diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/any.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/any.cxx index a6c9e72..c8ebc93 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/any.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/any.cxx @@ -1,8 +1,9 @@  // file      : xsd-frontend/semantic-graph/any.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/any.hxx>  #include <xsd-frontend/semantic-graph/compositors.hxx> @@ -10,31 +11,11 @@ namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; - -    namespace -    { -      struct AnyInit -      { -        AnyInit () -        { -          TypeInfo ti (typeid (Any)); -          ti.add_base (Access::public_, true, typeid (Nameable)); -          ti.add_base (Access::public_, true, typeid (Particle)); -          RTTI::insert (ti); -        } - -      } any_init_; -    } -      Any::      Any (Path const& file, -         UnsignedLong line, -         UnsignedLong column, -         WideString const& namespaces) +         unsigned long line, +         unsigned long column, +         String const& namespaces)          : Node (file, line, column),            prototype_ (0)      { @@ -42,11 +23,11 @@ namespace XSDFrontend        // chararcter.        // -      for (Size i (0), j (namespaces.find (L' '));;) +      for (size_t i (0), j (namespaces.find (L' '));;)        { -        if (j != WideString::npos) +        if (j != String::npos)          { -          namespaces_.push_back (WideString (namespaces, i, j - i)); +          namespaces_.push_back (String (namespaces, i, j - i));            i = j + 1;            j = namespaces.find (L' ', i); @@ -55,7 +36,7 @@ namespace XSDFrontend          {            // Last element.            // -          namespaces_.push_back (WideString (namespaces, i)); +          namespaces_.push_back (String (namespaces, i));            break;          }        } @@ -63,8 +44,8 @@ namespace XSDFrontend      Any::      Any (Path const& file, -         UnsignedLong line, -         UnsignedLong column, +         unsigned long line, +         unsigned long column,           NamespaceIterator begin,           NamespaceIterator end)          : Node (file, line, column), @@ -121,5 +102,21 @@ namespace XSDFrontend        return namespace_ (scope);      } + +    namespace +    { +      using compiler::type_info; + +      struct AnyInit +      { +        AnyInit () +        { +          type_info ti (typeid (Any)); +          ti.add_base (typeid (Nameable)); +          ti.add_base (typeid (Particle)); +          insert (ti); +        } +      } any_init_; +    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/any.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/any.hxx index ded9bd8..8e42762 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/any.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/any.hxx @@ -1,12 +1,11 @@  // file      : xsd-frontend/semantic-graph/any.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ANY_HXX  #define XSD_FRONTEND_SEMANTIC_GRAPH_ANY_HXX -#include <cult/containers/vector.hxx> +#include <vector>  #include <xsd-frontend/semantic-graph/elements.hxx>  #include <xsd-frontend/semantic-graph/particle.hxx> @@ -19,12 +18,10 @@ namespace XSDFrontend      class Any: public virtual Nameable,                 public virtual Particle      { -      typedef -      Cult::Containers::Vector<WideString> -      Namespaces; +      typedef std::vector<String> Namespaces;      public: -      typedef Namespaces::ConstIterator NamespaceIterator; +      typedef Namespaces::const_iterator NamespaceIterator;        NamespaceIterator        namespace_begin () const @@ -39,7 +36,7 @@ namespace XSDFrontend        }      public: -      Boolean +      bool        prototype_p ()        {          return prototype_ != 0; @@ -52,7 +49,7 @@ namespace XSDFrontend          return *prototype_;        } -      Void +      void        prototype (Any& a)        {          assert (prototype_ == 0); @@ -63,17 +60,15 @@ namespace XSDFrontend        Namespace&        definition_namespace (); -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        Any (Path const& file, -           UnsignedLong line, -           UnsignedLong column, -           WideString const& namespaces); +           unsigned long line, +           unsigned long column, +           String const& namespaces);        Any (Path const& file, -           UnsignedLong line, -           UnsignedLong column, +           unsigned long line, +           unsigned long column,             NamespaceIterator begin,             NamespaceIterator end); diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/attribute-group.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/attribute-group.cxx index 54bb5df..f61fa39 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/attribute-group.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/attribute-group.cxx @@ -1,39 +1,34 @@  // file      : xsd-frontend/semantic-graph/attribute-group.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/attribute-group.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; - +    AttributeGroup:: +    AttributeGroup (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    }      namespace      { +      using compiler::type_info; +        struct AttributeGroupInit        {          AttributeGroupInit ()          { -          TypeInfo ti (typeid (AttributeGroup)); -          ti.add_base (Access::public_, true, typeid (Scope)); -          RTTI::insert (ti); +          type_info ti (typeid (AttributeGroup)); +          ti.add_base (typeid (Scope)); +          insert (ti);          } -        } attribute_group_init_;      } - -    AttributeGroup:: -    AttributeGroup (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    } -    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/attribute-group.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/attribute-group.hxx index 44739f2..62a1f81 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/attribute-group.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/attribute-group.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/attribute-group.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ATTRIBUTE_GROUP_HXX @@ -14,12 +13,10 @@ namespace XSDFrontend    {      class AttributeGroup: public virtual Scope      { -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        AttributeGroup (Path const& file, -                      UnsignedLong line, -                      UnsignedLong column); +                      unsigned long line, +                      unsigned long column);      };    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/attribute.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/attribute.cxx index 2e30d4e..624b16a 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/attribute.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/attribute.cxx @@ -1,44 +1,41 @@  // file      : xsd-frontend/semantic-graph/attribute.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/attribute.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; +    Attribute:: +    Attribute (Path const& file, +               unsigned long line, +               unsigned long column, +               bool optional, +               bool global, +               bool qualified) +        : Node (file, line, column), +          Member (global, qualified), +          optional_ (optional) +    { +    }      namespace      { +      using compiler::type_info; +        struct AttributeInit        {          AttributeInit ()          { -          TypeInfo ti (typeid (Attribute)); -          ti.add_base (Access::public_, true, typeid (Member)); -          RTTI::insert (ti); +          type_info ti (typeid (Attribute)); +          ti.add_base (typeid (Member)); +          insert (ti);          } -        } attribute_init_;      } - -    Attribute:: -    Attribute (Path const& file, -               UnsignedLong line, -               UnsignedLong column, -               Boolean optional, -               Boolean global, -               Boolean qualified) -        : Node (file, line, column), -          Member (global, qualified), -          optional_ (optional) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/attribute.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/attribute.hxx index f7a516d..9d9b0fb 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/attribute.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/attribute.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/attribute.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ATTRIBUTE_HXX @@ -15,23 +14,21 @@ namespace XSDFrontend      class Attribute: public virtual Member      {      public: -      Boolean +      bool        optional_p () const        {          return optional_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        Attribute (Path const& file, -                 UnsignedLong line, -                 UnsignedLong column, -                 Boolean optional, -                 Boolean global, -                 Boolean qualified); +                 unsigned long line, +                 unsigned long column, +                 bool optional, +                 bool global, +                 bool qualified);      private: -      Boolean optional_; +      bool optional_;      };    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/complex.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/complex.cxx index 0cc265f..8433a0e 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/complex.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/complex.cxx @@ -1,34 +1,15 @@  // file      : xsd-frontend/semantic-graph/complex.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/complex.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; - -    namespace -    { -      struct ComplexInit -      { -        ComplexInit () -        { -          TypeInfo ti (typeid (Complex)); -          ti.add_base (Access::public_, true, typeid (Type)); -          ti.add_base (Access::public_, true, typeid (Scope)); -          RTTI::insert (ti); -        } - -      } complex_init_; -    } -      Complex::      Complex ()          : mixed_ (false), contains_compositor_ (0) @@ -36,10 +17,26 @@ namespace XSDFrontend      }      Complex:: -    Complex (Path const& file, UnsignedLong line, UnsignedLong column) +    Complex (Path const& file, unsigned long line, unsigned long column)          : Node (file, line, column),            mixed_ (false), contains_compositor_ (0)      {      } + +    namespace +    { +      using compiler::type_info; + +      struct ComplexInit +      { +        ComplexInit () +        { +          type_info ti (typeid (Complex)); +          ti.add_base (typeid (Type)); +          ti.add_base (typeid (Scope)); +          insert (ti); +        } +      } complex_init_; +    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/complex.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/complex.hxx index 40327bc..ac47810 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/complex.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/complex.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/complex.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_COMPLEX_HXX @@ -9,8 +8,6 @@  #include <xsd-frontend/semantic-graph/elements.hxx>  #include <xsd-frontend/semantic-graph/compositors.hxx> -#include <cult/containers/vector.hxx> -  namespace XSDFrontend  {    namespace SemanticGraph @@ -18,15 +15,27 @@ namespace XSDFrontend      class Complex: public virtual Type, public virtual Scope      {      public: -      Boolean +      bool        mixed_p () const        { -        return mixed_; +        if (mixed_) +          return true; + +        // If we have empty content, then we have the same content +        // type as our base. +        // +        if (!contains_compositor_p () && inherits_p ()) +        { +          if (Complex* b = dynamic_cast<Complex*> (&inherits ().base ())) +            return b->mixed_p (); +        } + +        return false;        }      public: -      Boolean -      contains_compositor_p () +      bool +      contains_compositor_p () const        {          return contains_compositor_ != 0;        } @@ -39,37 +48,37 @@ namespace XSDFrontend        }      public: -      Void -      mixed_p (Boolean m) +      void +      mixed_p (bool m)        {          mixed_ = m;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Complex (); // Virtual inheritance (Enumeration). -      Complex (Path const& file, UnsignedLong line, UnsignedLong column); - -      using Type::add_edge_right; -      using Type::add_edge_left; -      using Scope::add_edge_left; +    public: +      Complex (Path const& file, unsigned long line, unsigned long column); -      Void +      void        add_edge_left (ContainsCompositor& e)        {          contains_compositor_ = &e;        } -      Void +      void        remove_edge_left (ContainsCompositor& e)        {          assert (contains_compositor_ == &e);          contains_compositor_ = 0;        } +      using Type::add_edge_right; +      using Type::add_edge_left; +      using Scope::add_edge_left; + +    protected: +      Complex (); // For virtual inheritance (Enumeration). +      private: -      Boolean mixed_; +      bool mixed_;        ContainsCompositor* contains_compositor_;      };    } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/compositors.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/compositors.cxx index 08953bc..dd65e56 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/compositors.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/compositors.cxx @@ -1,124 +1,100 @@  // file      : xsd-frontend/semantic-graph/compositor.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/compositors.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; +    // ContainsCompositor +    // +    ContainsCompositor:: +    ContainsCompositor (unsigned long min, unsigned long max) +        : compositor_ (0), container_ (0), min_ (min), max_ (max) +    { +    } -    using RTTI::Access; -    using RTTI::TypeInfo; +    // All +    // +    All:: +    All (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    } +    // Choice +    // +    Choice:: +    Choice (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    } -    // ContainsCompositor +    // Sequence      // +    Sequence:: +    Sequence (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    } +      namespace      { +      using compiler::type_info; +        struct ContainsCompositorInit        {          ContainsCompositorInit ()          { -          TypeInfo ti (typeid (ContainsCompositor)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (ContainsCompositor)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } contains_compositor_init_; -    } -    ContainsCompositor:: -    ContainsCompositor (UnsignedLong min, UnsignedLong max) -        : compositor_ (0), container_ (0), min_ (min), max_ (max) -    { -    } - -    // Compositor -    // -    namespace -    {        struct CompositorInit        {          CompositorInit ()          { -          TypeInfo ti (typeid (Compositor)); -          ti.add_base (Access::public_, true, typeid (Particle)); -          RTTI::insert (ti); +          type_info ti (typeid (Compositor)); +          ti.add_base (typeid (Particle)); +          insert (ti);          } -        } compositor_init_; -    } - -    // All -    // -    namespace -    {        struct AllInit        {          AllInit ()          { -          TypeInfo ti (typeid (All)); -          ti.add_base (Access::public_, true, typeid (Compositor)); -          RTTI::insert (ti); +          type_info ti (typeid (All)); +          ti.add_base (typeid (Compositor)); +          insert (ti);          } -        } all_init_; -    } -    All:: -    All (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    } - - -    // Choice -    // -    namespace -    {        struct ChoiceInit        {          ChoiceInit ()          { -          TypeInfo ti (typeid (Choice)); -          ti.add_base (Access::public_, true, typeid (Compositor)); -          RTTI::insert (ti); +          type_info ti (typeid (Choice)); +          ti.add_base (typeid (Compositor)); +          insert (ti);          } -        } choice_init_; -    } -    Choice:: -    Choice (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    } - -    // Sequence -    // -    namespace -    {        struct SequenceInit        {          SequenceInit ()          { -          TypeInfo ti (typeid (Sequence)); -          ti.add_base (Access::public_, true, typeid (Compositor)); -          RTTI::insert (ti); +          type_info ti (typeid (Sequence)); +          ti.add_base (typeid (Compositor)); +          insert (ti);          } -        } sequence_init_;      } - -    Sequence:: -    Sequence (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/compositors.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/compositors.hxx index c82d8a4..3573c24 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/compositors.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/compositors.hxx @@ -1,12 +1,11 @@  // file      : xsd-frontend/semantic-graph/compositors.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_COMPOSITORS_HXX  #define XSD_FRONTEND_SEMANTIC_GRAPH_COMPOSITORS_HXX -#include <cult/containers/list.hxx> +#include <list>  #include <xsd-frontend/semantic-graph/elements.hxx>  #include <xsd-frontend/semantic-graph/particle.hxx> @@ -33,43 +32,41 @@ namespace XSDFrontend        }      public: -      UnsignedLong +      unsigned long        min () const        {          return min_;        } -      UnsignedLong +      unsigned long        max () const        {          return max_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      ContainsCompositor (UnsignedLong min, UnsignedLong max); +    public: +      ContainsCompositor (unsigned long min, unsigned long max); -      Void +      void        set_left_node (Node& n)        {          container_ = &n;        } -      Void +      void        set_right_node (Compositor& n)        {          compositor_ = &n;        } -      Void +      void        clear_left_node (Node& n)        {          assert (container_ == &n);          container_ = 0;        } -      Void +      void        clear_right_node (Compositor& n)        {          assert (compositor_ == &n); @@ -79,25 +76,19 @@ namespace XSDFrontend      private:        Compositor* compositor_;        Node* container_; -      UnsignedLong min_, max_; +      unsigned long min_, max_;      }; -      //      //      class Compositor: public virtual Particle      { -      typedef -      Cult::Containers::List<ContainsParticle*> -      ContainsList; +      typedef std::list<ContainsParticle*> ContainsList;      public: +      typedef pointer_iterator<ContainsList::iterator> ContainsIterator;        typedef -      Bits::PointerIterator<ContainsList::Iterator> -      ContainsIterator; - -      typedef -      Bits::PointerIterator<ContainsList::ConstIterator> +      pointer_iterator<ContainsList::const_iterator>        ContainsConstIterator;        ContainsIterator @@ -125,7 +116,7 @@ namespace XSDFrontend        }      public: -      Boolean +      bool        contained_compositor_p ()        {          return contained_compositor_ != 0; @@ -139,7 +130,7 @@ namespace XSDFrontend        }      public: -      UnsignedLong +      unsigned long        min () const        {          if (contained_compositor_ != 0) @@ -148,7 +139,7 @@ namespace XSDFrontend            return Particle::min ();        } -      UnsignedLong +      unsigned long        max () const        {          if (contained_compositor_ != 0) @@ -157,24 +148,31 @@ namespace XSDFrontend            return Particle::max ();        } -    protected: -      friend class Bits::Graph<Node, Edge>; +    public: +      Compositor (): contained_compositor_ (0) {} -      Compositor () -          : contained_compositor_ (0) +      void +      add_edge_left (ContainsParticle& e)        { +        contains_.push_back (&e);        } -      Void -      add_edge_left (ContainsParticle& e) +      void +      add_edge_left (ContainsParticle& e, ContainsIterator const& after)        { -        contains_.push_back (&e); +        if (after.base () == contains_.end ()) +          contains_.push_front (&e); +        else +        { +          ContainsList::iterator i (after.base ()); +          contains_.insert (++i, &e); +        }        } -      Void +      void        remove_edge_left (ContainsParticle& e)        { -        for (ContainsList::Iterator i (contains_.begin ()); +        for (ContainsList::iterator i (contains_.begin ());               i != contains_.end (); ++i)          {            if (*i == &e) @@ -185,77 +183,50 @@ namespace XSDFrontend          }        } -      //@@ Ideally should be protected but then NodeArg has no way to -      //   access it. Maybe when (if) I move NodeArg into Grpah I can -      //   resolve this. -      // -    public: -      Void -      add_edge_left (ContainsParticle& e, ContainsIterator const& after) -      { -        if (after.base () == contains_.end ()) -          contains_.push_front (&e); -        else -        { -          ContainsList::Iterator i (after.base ()); -          contains_.insert (++i, &e); -        } -      } - -    protected: -      using Node::add_edge_right; -      using Particle::add_edge_right; -      using Particle::remove_edge_right; - -      Void +      void        add_edge_right (ContainsCompositor& e)        {          contained_compositor_ = &e;        } -      Void +      void        remove_edge_right (ContainsCompositor& e)        {          assert (contained_compositor_ == &e);          contained_compositor_ = 0;        } +      using Node::add_edge_right; +      using Particle::add_edge_right; +      using Particle::remove_edge_right; +      private:        ContainsList contains_;        ContainsCompositor* contained_compositor_;      }; -      //      //      class All: public virtual Compositor      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      All (Path const& file, UnsignedLong line, UnsignedLong column); +    public: +      All (Path const& file, unsigned long line, unsigned long column);      }; -      //      //      class Choice: public virtual Compositor      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Choice (Path const& file, UnsignedLong line, UnsignedLong column); +    public: +      Choice (Path const& file, unsigned long line, unsigned long column);      }; -      //      //      class Sequence: public virtual Compositor      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Sequence (Path const& file, UnsignedLong line, UnsignedLong column); +    public: +      Sequence (Path const& file, unsigned long line, unsigned long column);      };    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/element-group.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/element-group.cxx index 0e71aa6..a02d751 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/element-group.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/element-group.cxx @@ -1,38 +1,34 @@  // file      : xsd-frontend/semantic-graph/element-group.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/element-group.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; - +    ElementGroup:: +    ElementGroup (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column), contains_compositor_ (0) +    { +    }      namespace      { +      using compiler::type_info; +        struct ElementGroupInit        {          ElementGroupInit ()          { -          TypeInfo ti (typeid (ElementGroup)); -          ti.add_base (Access::public_, true, typeid (Scope)); -          RTTI::insert (ti); +          type_info ti (typeid (ElementGroup)); +          ti.add_base (typeid (Scope)); +          insert (ti);          } -        } element_group_init_;      } - -    ElementGroup:: -    ElementGroup (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column), contains_compositor_ (0) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/element-group.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/element-group.hxx index 23514b5..ee7772c 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/element-group.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/element-group.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/element-group.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ELEMENT_GROUP_HXX @@ -23,19 +22,17 @@ namespace XSDFrontend          return *contains_compositor_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      ElementGroup (Path const& file, UnsignedLong line, UnsignedLong column); - -      using Scope::add_edge_left; +    public: +      ElementGroup (Path const& file, unsigned long line, unsigned long column); -      Void +      void        add_edge_left (ContainsCompositor& e)        {          contains_compositor_ = &e;        } +      using Scope::add_edge_left; +      private:        ContainsCompositor* contains_compositor_;      }; diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/element.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/element.cxx index 1d8cda5..fb7d3a7 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/element.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/element.cxx @@ -1,63 +1,53 @@  // file      : xsd-frontend/semantic-graph/element.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/element.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; - - -    // Substitutes +    // Element      // +    Element:: +    Element (Path const& file, +             unsigned long line, +             unsigned long column, +             bool global, +             bool qualified) +        : Node (file, line, column), +          Member (global, qualified), +          substitutes_ (0) +    { +    } +      namespace      { +      using compiler::type_info; +        struct SubstitutesInit        {          SubstitutesInit ()          { -          TypeInfo ti (typeid (Substitutes)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Substitutes)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } substitutes_init_; -    } -    // Element -    // -    namespace -    {        struct ElementInit        {          ElementInit ()          { -          TypeInfo ti (typeid (Element)); -          ti.add_base (Access::public_, true, typeid (Member)); -          ti.add_base (Access::public_, true, typeid (Particle)); -          RTTI::insert (ti); +          type_info ti (typeid (Element)); +          ti.add_base (typeid (Member)); +          ti.add_base (typeid (Particle)); +          insert (ti);          } -        } element_init_;      } - -    Element:: -    Element (Path const& file, -             UnsignedLong line, -             UnsignedLong column, -             Boolean global, -             Boolean qualified) -        : Node (file, line, column), -          Member (global, qualified), -          substitutes_ (0) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/element.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/element.hxx index e7046e4..0af164e 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/element.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/element.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/element.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ELEMENT_HXX @@ -30,20 +29,14 @@ namespace XSDFrontend          return *root_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Substitutes () -      { -      } - -      Void +    public: +      void        set_left_node (Element& n)        {          substitution_ = &n;        } -      Void +      void        set_right_node (Element& n)        {          root_ = &n; @@ -59,7 +52,7 @@ namespace XSDFrontend                     public virtual Particle      {      public: -      Boolean +      bool        substitutes_p () const        {          return substitutes_ != 0; @@ -72,25 +65,21 @@ namespace XSDFrontend          return *substitutes_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        Element (Path const& file, -               UnsignedLong line, -               UnsignedLong column, -               Boolean global, -               Boolean qualified); +               unsigned long line, +               unsigned long column, +               bool global, +               bool qualified); -      Void +      void        add_edge_left (Substitutes& e)        {          substitutes_ = &e;        } -      Void -      add_edge_right (Substitutes&) -      { -      } +      void +      add_edge_right (Substitutes&) {}        using Member::add_edge_left;        using Member::add_edge_right; diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx index 6a2addf..fa48a9a 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/elements.cxx @@ -1,10 +1,11 @@  // file      : xsd-frontend/semantic-graph/elements.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <algorithm> +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/elements.hxx>  #include <xsd-frontend/semantic-graph/annotation.hxx> @@ -24,32 +25,29 @@ namespace XSDFrontend      // Type      // -    Void Type:: +    void Type::      remove_edge_left (Arguments& a)      { -      ArgumentsSet::Iterator i (arguments_.find (&a)); +      ArgumentsSet::iterator i (arguments_.find (&a));        assert (i != arguments_.end ());        arguments_.erase (i);      }      // Specialization      // -    Void Specialization:: +    void Specialization::      remove_edge_right (Arguments& a)      {        // The number of entries should be small so linear search will do.        // -      Argumented::Iterator i ( +      Argumented::iterator i (          std::find (argumented_.begin (), argumented_.end (), &a));        assert (i != argumented_.end ());        argumented_.erase (i);      } -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; +    using compiler::type_info;      namespace      { @@ -59,209 +57,178 @@ namespace XSDFrontend        {          EdgeInit ()          { -          TypeInfo ti (typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Edge)); +          insert (ti);          } -        } edge_init_; -        // Node        //        struct NodeInit        {          NodeInit ()          { -          TypeInfo ti (typeid (Node)); -          RTTI::insert (ti); +          type_info ti (typeid (Node)); +          insert (ti);          } -        } node_init_; -        // Names        //        struct NamesInit        {          NamesInit ()          { -          TypeInfo ti (typeid (Names)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Names)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } names_init_; -        // Nameable        //        struct NameableInit        {          NameableInit ()          { -          TypeInfo ti (typeid (Nameable)); -          ti.add_base (Access::public_, true, typeid (Node)); -          RTTI::insert (ti); +          type_info ti (typeid (Nameable)); +          ti.add_base (typeid (Node)); +          insert (ti);          } -        } nameable_init_; -        // Scope        //        struct ScopeInit        {          ScopeInit ()          { -          TypeInfo ti (typeid (Scope)); -          ti.add_base (Access::public_, true, typeid (Nameable)); -          RTTI::insert (ti); +          type_info ti (typeid (Scope)); +          ti.add_base (typeid (Nameable)); +          insert (ti);          } -        } scope_init_; -        // Type        //        struct TypeInit        {          TypeInit ()          { -          TypeInfo ti (typeid (Type)); -          ti.add_base (Access::public_, true, typeid (Nameable)); -          RTTI::insert (ti); +          type_info ti (typeid (Type)); +          ti.add_base (typeid (Nameable)); +          insert (ti);          } -        } type_init_; -        // Instance        //        struct InstanceInit        {          InstanceInit ()          { -          TypeInfo ti (typeid (Instance)); -          ti.add_base (Access::public_, true, typeid (Nameable)); -          RTTI::insert (ti); +          type_info ti (typeid (Instance)); +          ti.add_base (typeid (Nameable)); +          insert (ti);          } -        } instance_init_; -        // Belongs        //        struct BelongsInit        {          BelongsInit ()          { -          TypeInfo ti (typeid (Belongs)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Belongs)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } belongs_init_; - -        // Inherits        //        struct InheritsInit        {          InheritsInit ()          { -          TypeInfo ti (typeid (Inherits)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Inherits)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } inherits_init_; -        // Extends        //        struct ExtendsInit        {          ExtendsInit ()          { -          TypeInfo ti (typeid (Extends)); -          ti.add_base (Access::public_, true, typeid (Inherits)); -          RTTI::insert (ti); +          type_info ti (typeid (Extends)); +          ti.add_base (typeid (Inherits)); +          insert (ti);          } -        } extends_init_; -        // Restricts        //        struct RestrictsInit        {          RestrictsInit ()          { -          TypeInfo ti (typeid (Restricts)); -          ti.add_base (Access::public_, true, typeid (Inherits)); -          RTTI::insert (ti); +          type_info ti (typeid (Restricts)); +          ti.add_base (typeid (Inherits)); +          insert (ti);          } -        } restricts_init_; -        // BelongsToNamespace        //        struct BelongsToNamespaceInit        {          BelongsToNamespaceInit ()          { -          TypeInfo ti (typeid (BelongsToNamespace)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (BelongsToNamespace)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } belongs_to_namespace_init_; -        // Member        //        struct MemberInit        {          MemberInit ()          { -          TypeInfo ti (typeid (Member)); -          ti.add_base (Access::public_, true, typeid (Instance)); -          RTTI::insert (ti); +          type_info ti (typeid (Member)); +          ti.add_base (typeid (Instance)); +          insert (ti);          } -        } member_init_; -        // Specialization        //        struct SpecializationInit        {          SpecializationInit ()          { -          TypeInfo ti (typeid (Specialization)); -          ti.add_base (Access::public_, true, typeid (Type)); -          RTTI::insert (ti); +          type_info ti (typeid (Specialization)); +          ti.add_base (typeid (Type)); +          insert (ti);          } -        } specialization_init_; -        // Arguments        //        struct ArgumentsInit        {          ArgumentsInit ()          { -          TypeInfo ti (typeid (Arguments)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Arguments)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } arguments_init_; -        /*        // Contains        // @@ -269,64 +236,50 @@ namespace XSDFrontend        {          ContainsInit ()          { -          TypeInfo ti (typeid (Contains)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Contains)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } contains_init_; -        // Container        //        struct ContainerInit        {          ContainerInit ()          { -          TypeInfo ti (typeid (Container)); -          ti.add_base (Access::public_, true, typeid (Node)); -          RTTI::insert (ti); +          type_info ti (typeid (Container)); +          ti.add_base (typeid (Node)); +          insert (ti);          } -        } container_init_;        */ -        // AnyType        // -      namespace +      struct AnyTypeInit        { -        struct AnyTypeInit +        AnyTypeInit ()          { -          AnyTypeInit () -          { -            TypeInfo ti (typeid (AnyType)); -            ti.add_base (Access::public_, true, typeid (SemanticGraph::Type)); -            RTTI::insert (ti); -          } - -        } any_type_init_; -      } - +          type_info ti (typeid (AnyType)); +          ti.add_base (typeid (SemanticGraph::Type)); +            insert (ti); +        } +      } any_type_init_;        // AnySimpleType        // -      namespace +      struct AnySimpleTypeInit        { -        struct AnySimpleTypeInit +        AnySimpleTypeInit ()          { -          AnySimpleTypeInit () -          { -            TypeInfo ti (typeid (AnySimpleType)); -            ti.add_base (Access::public_, true, typeid (Type)); -            RTTI::insert (ti); -          } - -        } any_simple_type_init_; -      } +          type_info ti (typeid (AnySimpleType)); +          ti.add_base (typeid (Type)); +            insert (ti); +        } +      } any_simple_type_init_;      } -      // Instance      //      Type& Instance:: @@ -342,9 +295,5 @@ namespace XSDFrontend  std::wostream&  operator<< (std::wostream& os, XSDFrontend::SemanticGraph::Path const& path)  { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -  return os << path.native_file_string ().c_str (); -#else    return os << path.string ().c_str (); -#endif  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/elements.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/elements.hxx index 78b6615..98fb180 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/elements.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/elements.hxx @@ -1,171 +1,41 @@  // file      : xsd-frontend/semantic-graph/elements.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ELEMENTS_HXX  #define XSD_FRONTEND_SEMANTIC_GRAPH_ELEMENTS_HXX +#include <set> +#include <map> +#include <list> +#include <vector>  #include <iosfwd> +#include <utility> // std::pair +#include <cstdlib> // abort +#include <cassert> -#include <boost/filesystem/path.hpp> -#include <boost/filesystem/operations.hpp> -#include <boost/filesystem/exception.hpp> +#include <cutl/container/graph.hxx> +#include <cutl/container/pointer-iterator.hxx> +#include <cutl/compiler/context.hxx> +#include <cutl/fs/path.hxx> -#include <cult/types.hxx> - -#include <cult/rtti/type-info.hxx> - -#include <cult/containers/set.hxx> -#include <cult/containers/map.hxx> -#include <cult/containers/list.hxx> -#include <cult/containers/pair.hxx> -#include <cult/containers/graph.hxx> -#include <cult/containers/vector.hxx> - -#include <frontend-elements/context.hxx> +#include <xsd-frontend/types.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    using namespace Cult::Types; - -    namespace Bits -    { -      using Cult::Containers::Graph; - -      //@@ Should end up in Cult::Meta -      // -      template <typename X> -      struct strip_pointer -      { -        typedef X Type; -      }; - -      template <typename X> -      struct strip_pointer<X*> -      { -        typedef X Type; -      }; - -      template <typename I> -      struct PointerIterator -      { -        typedef -        typename strip_pointer<typename I::Value>::Type -        Value; - -        typedef I BaseIterator; -        typedef Value& Reference; -        typedef Value* Pointer; - -        PointerIterator () -            : i_ () // i_ can be of a pointer type. -        { -        } - -        PointerIterator (I const& i) -            : i_ (i) -        { -        } - -      public: -        Reference -        operator* () const -        { -          return **i_; -        } - -        Pointer -        operator-> () const -        { -          return *i_; -        } - -        I const& -        base () const -        { -          return i_; -        } - -      public: -        PointerIterator& -        operator++ () -        { -          ++i_; -          return *this; -        } - -        PointerIterator -        operator++ (Int) -        { -          PointerIterator r (*this); -          ++i_; -          return r; -        } - -        PointerIterator& -        operator-- () -        { -          --i_; -          return *this; -        } +    using namespace cutl; -        PointerIterator -        operator-- (Int) -        { -          PointerIterator r (*this); -          --i_; -          return r; -        } - -      private: -        I i_; -      }; - -      template <typename I> -      inline -      Boolean -      operator== (PointerIterator<I> const& a, PointerIterator<I> const& b) -      { -        return a.base () == b.base (); -      } - -      template <typename I> -      inline -      Boolean -      operator!= (PointerIterator<I> const& a, PointerIterator<I> const& b) -      { -        return a.base () != b.base (); -      } - -      template <typename I> -      inline -      typename PointerIterator<I>::BaseIterator::difference_type -      operator- (PointerIterator<I> const& a, PointerIterator<I> const& b) -      { -        return a.base () - b.base (); -      } -    } +    using container::pointer_iterator;      //      // -    typedef -    boost::filesystem::filesystem_error -    InvalidPath; - -    typedef -    boost::filesystem::path -    Path; +    typedef fs::path Path; +    typedef fs::invalid_path InvalidPath; +    typedef std::vector<Path> Paths; -    typedef -    Cult::Containers::Vector<Path> -    Paths; - -    typedef -    FrontendElements::Context -    Context; +    typedef compiler::context Context;      //      // @@ -195,24 +65,17 @@ namespace XSDFrontend      public:        template <typename X> -      Boolean +      bool        is_a () const        {          return dynamic_cast<X const*> (this) != 0;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Edge () -      { -      } -      private:        mutable Context context_;      }; -    inline Boolean +    inline bool      operator== (Edge const& x, Edge const& y)      {        return &x == &y; @@ -237,20 +100,20 @@ namespace XSDFrontend          return file_;        } -      UnsignedLong +      unsigned long        line () const        {          return line_;        } -      UnsignedLong +      unsigned long        column () const        {          return column_;        }      public: -      Boolean +      bool        annotated_p () const        {          return annotates_ != 0; @@ -267,56 +130,54 @@ namespace XSDFrontend      public:        template <typename X> -      Boolean +      bool        is_a () const        {          return dynamic_cast<X const*> (this) != 0;        }      public: -        virtual -      ~Node () -      { -      } +      ~Node () {} -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Node (Path const& file, UnsignedLong line, UnsignedLong column) +      Node (Path const& file, unsigned long line, unsigned long column)            : annotates_ (0), file_ (file), line_ (line), column_ (column)        {        } -      Node () // For virtual inheritance. +      void +      add_edge_right (Annotates& a)        { -        abort (); // Told you so! +        annotates_ = &a;        } -      Void -      add_edge_right (Annotates& a) +    protected: +      Node () // For virtual inheritance.        { -        annotates_ = &a; +        abort (); // Told you so!        }      private:        mutable Context context_;        Annotates* annotates_;        Path file_; -      UnsignedLong line_; -      UnsignedLong column_; +      unsigned long line_; +      unsigned long column_;      }; -    inline Boolean +    inline bool      operator== (Node const& x, Node const& y)      {        return &x == &y;      } +    // +    // +    typedef container::graph<Node, Edge> graph;      //      // -    typedef WideString Name; +    typedef String Name;      // @@ -348,34 +209,29 @@ namespace XSDFrontend          return *named_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Names (Name const& name) -          : name_ (name) -      { -      } +    public: +      Names (Name const& name): name_ (name) {} -      Void +      void        set_left_node (Scope& n)        {          scope_ = &n;        } -      Void +      void        set_right_node (Nameable& n)        {          named_ = &n;        } -      Void +      void        clear_left_node (Scope& n)        {          assert (scope_ == &n);          scope_ = 0;        } -      Void +      void        clear_right_node (Nameable& n)        {          assert (named_ == &n); @@ -392,7 +248,7 @@ namespace XSDFrontend      class Nameable: public virtual Node      {      public: -      Boolean +      bool        named_p () const        {          return named_ != 0; @@ -419,21 +275,16 @@ namespace XSDFrontend          return *named_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Nameable () -          : named_ (0) -      { -      } +    public: +      Nameable (): named_ (0) {} -      Void +      void        add_edge_right (Names& e)        {          named_ = &e;        } -      Void +      void        remove_edge_right (Names& e)        {          assert (named_ == &e); @@ -446,42 +297,25 @@ namespace XSDFrontend        Names* named_;      }; -      //      // -    typedef -    Cult::Containers::Set<Nameable*> -    Nameables; - +    typedef std::set<Nameable*> Nameables;      //      //      class Scope: public virtual Nameable      {      protected: -      typedef -      Cult::Containers::List<Names*> -      NamesList; - -      typedef -      Cult::Containers::Map<Names*, NamesList::Iterator> -      ListIteratorMap; - -      typedef -      Cult::Containers::Map<Name, NamesList> -      NamesMap; +      typedef std::list<Names*> NamesList; +      typedef std::map<Names*, NamesList::iterator> ListIteratorMap; +      typedef std::map<Name, NamesList> NamesMap;      public: -      typedef -      Bits::PointerIterator<NamesList::Iterator> -      NamesIterator; - -      typedef -      Bits::PointerIterator<NamesList::ConstIterator> -      NamesConstIterator; +      typedef pointer_iterator<NamesList::iterator> NamesIterator; +      typedef pointer_iterator<NamesList::const_iterator> NamesConstIterator;        typedef -      Cult::Containers::Pair <NamesConstIterator, NamesConstIterator> +      std::pair<NamesConstIterator, NamesConstIterator>        NamesIteratorPair;        NamesIterator @@ -511,7 +345,7 @@ namespace XSDFrontend        virtual NamesIteratorPair        find (Name const& name) const        { -        NamesMap::ConstIterator i (names_map_.find (name)); +        NamesMap::const_iterator i (names_map_.find (name));          if (i == names_map_.end ())            return NamesIteratorPair (names_.end (), names_.end ()); @@ -522,42 +356,36 @@ namespace XSDFrontend        NamesIterator        find (Names& e)        { -        ListIteratorMap::Iterator i (iterator_map_.find (&e)); +        ListIteratorMap::iterator i (iterator_map_.find (&e));          return i != iterator_map_.end () ? i->second : names_.end ();        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Scope (Path const& file, UnsignedLong line, UnsignedLong column) +    public: +      Scope (Path const& file, unsigned long line, unsigned long column)            : Node (file, line, column)        {        } -      Scope () -      { -      } - -      Void +      void        add_edge_left (Names& e)        { -        NamesList::Iterator i (names_.insert (names_.end (), &e)); +        NamesList::iterator i (names_.insert (names_.end (), &e));          iterator_map_[&e] = i;          names_map_[e.name ()].push_back (&e);        } -      Void +      void        remove_edge_left (Names& e)        { -        ListIteratorMap::Iterator i (iterator_map_.find (&e)); +        ListIteratorMap::iterator i (iterator_map_.find (&e));          assert (i != iterator_map_.end ());          names_.erase (i->second);          iterator_map_.erase (i); -        NamesMap::Iterator j (names_map_.find (e.name ())); +        NamesMap::iterator j (names_map_.find (e.name ())); -        for (NamesList::Iterator i (j->second.begin ()); +        for (NamesList::iterator i (j->second.begin ());               i != j->second.end (); ++i)          {            if (*i == &e) @@ -565,21 +393,16 @@ namespace XSDFrontend          }        } -      //@@ Ideally should be protected but then NodeArg has no way to -      //   access it. Maybe when (if) I move NodeArg into Grpah I can -      //   resolve this. -      // -    public: -      Void +      void        add_edge_left (Names& e, NamesIterator const& after)        { -        NamesList::Iterator i; +        NamesList::iterator i;          if (after.base () == names_.end ())            i = names_.insert (names_.begin (), &e);          else          { -          NamesList::Iterator j (after.base ()); +          NamesList::iterator j (after.base ());            i = names_.insert (++j, &e);          } @@ -587,9 +410,11 @@ namespace XSDFrontend          names_map_[e.name ()].push_back (&e);        } -    protected:        using Nameable::add_edge_right; +    protected: +      Scope () {} +      private:        NamesList names_;        ListIteratorMap iterator_map_; @@ -606,22 +431,12 @@ namespace XSDFrontend      class Type: public virtual Nameable      {      protected: -      typedef -      Cult::Containers::Vector<Belongs*> -      Classifies; - -      typedef -      Cult::Containers::Vector<Inherits*> -      Begets; - -      typedef -      Cult::Containers::Set<Arguments*> -      ArgumentsSet; +      typedef std::vector<Belongs*> Classifies; +      typedef std::vector<Inherits*> Begets; +      typedef std::set<Arguments*> ArgumentsSet;      public: -      typedef -      Bits::PointerIterator<Classifies::ConstIterator> -      ClassifiesIterator; +      typedef pointer_iterator<Classifies::const_iterator> ClassifiesIterator;        ClassifiesIterator        classifies_begin () const @@ -637,7 +452,7 @@ namespace XSDFrontend        //        // -      Boolean +      bool        inherits_p () const        {          return inherits_ != 0; @@ -652,9 +467,7 @@ namespace XSDFrontend        //        // -      typedef -      Bits::PointerIterator<Begets::ConstIterator> -      BegetsIterator; +      typedef pointer_iterator<Begets::const_iterator> BegetsIterator;        BegetsIterator        begets_begin () const @@ -670,9 +483,7 @@ namespace XSDFrontend        //        // -      typedef -      Bits::PointerIterator<ArgumentsSet::ConstIterator> -      ArgumentsIterator; +      typedef pointer_iterator<ArgumentsSet::const_iterator> ArgumentsIterator;        ArgumentsIterator        arguments_begin () const @@ -686,21 +497,16 @@ namespace XSDFrontend          return arguments_.end ();        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Type () -          : inherits_ (0) -      { -      } +    public: +      Type (): inherits_ (0) {} -      Void +      void        add_edge_right (Belongs& e)        {          classifies_.push_back (&e);        } -      Void +      void        add_edge_right (Inherits& e)        {          begets_.push_back (&e); @@ -708,16 +514,16 @@ namespace XSDFrontend        using Nameable::add_edge_right; -      Void +      void        add_edge_left (Arguments& a)        {          arguments_.insert (&a);        } -      Void +      void        remove_edge_left (Arguments&); -      Void +      void        add_edge_left (Inherits& e)        {          inherits_ = &e; @@ -730,7 +536,6 @@ namespace XSDFrontend        ArgumentsSet arguments_;      }; -      class Instance: public virtual Nameable      {      public: @@ -743,21 +548,16 @@ namespace XSDFrontend        Type&        type () const; -      Boolean +      bool        typed_p () const        {          return belongs_ != 0;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Instance () -          : belongs_ (0) -      { -      } +    public: +      Instance (): belongs_ (0) {} -      Void +      void        add_edge_left (Belongs& e)        {          belongs_ = &e; @@ -783,20 +583,14 @@ namespace XSDFrontend          return *type_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Belongs () -      { -      } - -      Void +    public: +      void        set_left_node (Instance& n)        {          instance_ = &n;        } -      Void +      void        set_right_node (Type& n)        {          type_ = &n; @@ -825,20 +619,14 @@ namespace XSDFrontend          return *derived_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Inherits () -      { -      } - -      Void +    public: +      void        set_left_node (Type& n)        {          derived_ = &n;        } -      Void +      void        set_right_node (Type& n)        {          base_ = &n; @@ -849,30 +637,17 @@ namespace XSDFrontend        Type* derived_;      }; -      class Extends: public virtual Inherits      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Extends () -      { -      }      };      class Restricts: public virtual Inherits      { -    protected: -      typedef -      Cult::Containers::Map<WideString, WideString> -      Facets; -      public: -      typedef -      Facets::Iterator -      FacetIterator; +      typedef std::map<String, String> Facets; +      typedef Facets::iterator FacetIterator; -      Boolean +      bool        facet_empty ()        {          return facets_.empty (); @@ -891,22 +666,21 @@ namespace XSDFrontend        }        FacetIterator -      facet_find (WideString const& name) +      facet_find (String const& name)        {          return facets_.find (name);        } -      Void +      void        facet_insert (String const& name, String const& value)        {          facets_[name] = value;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Restricts () +      Facets const& +      facets () const        { +        return facets_;        }      protected: @@ -936,21 +710,16 @@ namespace XSDFrontend          return *namespace__;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      BelongsToNamespace () -          : member_ (0), namespace__ (0) -      { -      } +    public: +      BelongsToNamespace (): member_ (0), namespace__ (0) {} -      Void +      void        set_left_node (Member& n)        {          member_ = &n;        } -      Void +      void        set_right_node (Namespace& n)        {          namespace__ = &n; @@ -969,13 +738,13 @@ namespace XSDFrontend        // Member is global either if it is defined outside any type        // or it is a ref="" of a global member.        // -      Boolean +      bool        global_p () const        {          return global_;        } -      Boolean +      bool        qualified_p () const        {          return qualified_; @@ -995,13 +764,13 @@ namespace XSDFrontend        // is a superset of the default value semantics. As such setting the        // fixed value appears as if the default value was also set.        // -      Boolean +      bool        default_p () const        {          return value_type_ != ValueType::none;        } -      Boolean +      bool        fixed_p () const        {          return value_type_ == ValueType::fixed; @@ -1009,7 +778,7 @@ namespace XSDFrontend        struct NoValue {}; -      WideString +      String        value () const        {          if (value_type_ != ValueType::none) @@ -1020,24 +789,22 @@ namespace XSDFrontend        //        // -      Void -      default_ (WideString const& v) +      void +      default_ (String const& v)        {          value_ = v;          value_type_ = ValueType::default_;        } -      Void -      fixed (WideString const& v) +      void +      fixed (String const& v)        {          value_ = v;          value_type_ = ValueType::fixed;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Member (Boolean global, Boolean qualified) +    public: +      Member (bool global, bool qualified)            : global_ (global),              qualified_ (qualified),              belongs_to_namespace_ (0), @@ -1045,7 +812,7 @@ namespace XSDFrontend        {        } -      Void +      void        add_edge_left (BelongsToNamespace& e)        {          // In the parser we sometimes re-add the same adge. @@ -1056,8 +823,8 @@ namespace XSDFrontend        using Instance::add_edge_left;      private: -      Boolean global_; -      Boolean qualified_; +      bool global_; +      bool qualified_;        BelongsToNamespace* belongs_to_namespace_;        struct ValueType @@ -1070,7 +837,7 @@ namespace XSDFrontend          };        }; -      WideString value_; +      String value_;        ValueType::Value value_type_;      }; @@ -1080,17 +847,12 @@ namespace XSDFrontend      class Specialization: public virtual Type      { -      typedef -      Cult::Containers::Vector<Arguments*> -      Argumented; +      typedef std::vector<Arguments*> Argumented;      public: +      typedef pointer_iterator<Argumented::iterator> ArgumentedIterator;        typedef -      Bits::PointerIterator<Argumented::Iterator> -      ArgumentedIterator; - -      typedef -      Bits::PointerIterator<Argumented::ConstIterator> +      pointer_iterator<Argumented::const_iterator>        ArgumentedConstIterator;        ArgumentedIterator @@ -1125,32 +887,28 @@ namespace XSDFrontend          return *argumented_[0];        } -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        using Type::add_edge_right; -      Void +      void        add_edge_right (Arguments& a)        {          argumented_.push_back (&a);        } -      Void -      remove_edge_right (Arguments&); - -    public: -      Void +      void        add_edge_right (Arguments& a, ArgumentedIterator const& pos)        {          argumented_.insert (pos.base (), &a);        } +      void +      remove_edge_right (Arguments&); +      private:        Argumented argumented_;      }; -      class Arguments: public virtual Edge      {      public: @@ -1166,9 +924,7 @@ namespace XSDFrontend          return *specialization_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        void        set_left_node (Type& n)        { @@ -1205,17 +961,14 @@ namespace XSDFrontend      //      class AnyType: public virtual Type      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      AnyType (Path const& file, UnsignedLong line, UnsignedLong column) +    public: +      AnyType (Path const& file, unsigned long line, unsigned long column)            : Node (file, line, column)        {        } -      AnyType () // For virtual inheritance. -      { -      } +    protected: +      AnyType () {} // For virtual inheritance.      }; @@ -1223,17 +976,14 @@ namespace XSDFrontend      //      class AnySimpleType: public virtual Type      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      AnySimpleType (Path const& file, UnsignedLong line, UnsignedLong column) +    public: +      AnySimpleType (Path const& file, unsigned long line, unsigned long column)            : Node (file, line, column)        {        } -      AnySimpleType () // For virtual inheritance. -      { -      } +    protected: +      AnySimpleType () {} // For virtual inheritance.      };    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/enumeration.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/enumeration.cxx index adcf71e..93bcf79 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/enumeration.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/enumeration.cxx @@ -1,32 +1,45 @@  // file      : xsd-frontend/semantic-graph/enumeration.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/enumeration.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; +    // Enumeration +    // +    Enumeration:: +    Enumeration (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    } -    using RTTI::Access; -    using RTTI::TypeInfo; +    // Enumerator +    // +    Enumerator:: +    Enumerator (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    }      namespace      { +      using compiler::type_info; +        // Enumeration        //        struct EnumerationInit        {          EnumerationInit ()          { -          TypeInfo ti (typeid (Enumeration)); -          ti.add_base (Access::public_, true, typeid (Complex)); -          RTTI::insert (ti); +          type_info ti (typeid (Enumeration)); +          ti.add_base (typeid (Complex)); +          insert (ti);          } -        } enumeration_init_; @@ -36,32 +49,11 @@ namespace XSDFrontend        {          EnumeratorInit ()          { -          TypeInfo ti (typeid (Enumerator)); -          ti.add_base (Access::public_, true, typeid (Instance)); -          RTTI::insert (ti); +          type_info ti (typeid (Enumerator)); +          ti.add_base (typeid (Instance)); +          insert (ti);          } -        } enumerator_init_;      } - - -    // Enumeration -    // - -    Enumeration:: -    Enumeration (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    } - - -    // Enumerator -    // - -    Enumerator:: -    Enumerator (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/enumeration.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/enumeration.hxx index a21e8f3..90a33d1 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/enumeration.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/enumeration.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/enumeration.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_ENUMERATION_HXX @@ -15,19 +14,15 @@ namespace XSDFrontend    {      class Enumeration: public virtual Complex      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Enumeration (Path const& file, UnsignedLong line, UnsignedLong column); +    public: +      Enumeration (Path const& file, unsigned long line, unsigned long column);      };      class Enumerator: public virtual Instance      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Enumerator (Path const& file, UnsignedLong line, UnsignedLong column); +    public: +      Enumerator (Path const& file, unsigned long line, unsigned long column);      };    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.cxx new file mode 100644 index 0000000..cc98449 --- /dev/null +++ b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.cxx @@ -0,0 +1,1143 @@ +// file      : xsd-frontend/semantic-graph/fundamental.cxx +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Note, that this file is automatically generated! +// + +#include <cutl/compiler/type-info.hxx> + +#include <xsd-frontend/semantic-graph/fundamental.hxx> + +namespace XSDFrontend +{ +  namespace SemanticGraph +  { +    namespace Fundamental +    { +      using compiler::type_info; + +      // Type +      // +      namespace +      { +        struct TypeInit +        { +          TypeInit () +          { +            type_info ti (typeid (Type)); +            ti.add_base (typeid (SemanticGraph::Type)); +            insert (ti); +          } +        } any_type_init_; +      } + +      Type:: +      Type () +      { +      } + + +      // Byte +      // +      namespace +      { +        struct ByteInit +        { +          ByteInit () +          { +            type_info ti (typeid (Byte)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } byte_init_; +      } + +      Byte:: +      Byte (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // UnsignedByte +      // +      namespace +      { +        struct UnsignedByteInit +        { +          UnsignedByteInit () +          { +            type_info ti (typeid (UnsignedByte)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } unsigned_byte_init_; +      } + +      UnsignedByte:: +      UnsignedByte (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Short +      // +      namespace +      { +        struct ShortInit +        { +          ShortInit () +          { +            type_info ti (typeid (Short)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } short_init_; +      } + +      Short:: +      Short (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // UnsignedShort +      // +      namespace +      { +        struct UnsignedShortInit +        { +          UnsignedShortInit () +          { +            type_info ti (typeid (UnsignedShort)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } unsigned_short_init_; +      } + +      UnsignedShort:: +      UnsignedShort (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Int +      // +      namespace +      { +        struct IntInit +        { +          IntInit () +          { +            type_info ti (typeid (Int)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } int_init_; +      } + +      Int:: +      Int (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // UnsignedInt +      // +      namespace +      { +        struct UnsignedIntInit +        { +          UnsignedIntInit () +          { +            type_info ti (typeid (UnsignedInt)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } unsigned_int_init_; +      } + +      UnsignedInt:: +      UnsignedInt (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Long +      // +      namespace +      { +        struct LongInit +        { +          LongInit () +          { +            type_info ti (typeid (Long)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } long_init_; +      } + +      Long:: +      Long (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // UnsignedLong +      // +      namespace +      { +        struct UnsignedLongInit +        { +          UnsignedLongInit () +          { +            type_info ti (typeid (UnsignedLong)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } unsigned_long_init_; +      } + +      UnsignedLong:: +      UnsignedLong (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Integer +      // +      namespace +      { +        struct IntegerInit +        { +          IntegerInit () +          { +            type_info ti (typeid (Integer)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } integer_init_; +      } + +      Integer:: +      Integer (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // NonPositiveInteger +      // +      namespace +      { +        struct NonPositiveIntegerInit +        { +          NonPositiveIntegerInit () +          { +            type_info ti (typeid (NonPositiveInteger)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } non_positive_integer_init_; +      } + +      NonPositiveInteger:: +      NonPositiveInteger (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // NonNegativeInteger +      // +      namespace +      { +        struct NonNegativeIntegerInit +        { +          NonNegativeIntegerInit () +          { +            type_info ti (typeid (NonNegativeInteger)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } non_negative_integer_init_; +      } + +      NonNegativeInteger:: +      NonNegativeInteger (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // PositiveInteger +      // +      namespace +      { +        struct PositiveIntegerInit +        { +          PositiveIntegerInit () +          { +            type_info ti (typeid (PositiveInteger)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } positive_integer_init_; +      } + +      PositiveInteger:: +      PositiveInteger (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // NegativeInteger +      // +      namespace +      { +        struct NegativeIntegerInit +        { +          NegativeIntegerInit () +          { +            type_info ti (typeid (NegativeInteger)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } negative_integer_init_; +      } + +      NegativeInteger:: +      NegativeInteger (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Boolean +      // +      namespace +      { +        struct BooleanInit +        { +          BooleanInit () +          { +            type_info ti (typeid (Boolean)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } boolean_init_; +      } + +      Boolean:: +      Boolean (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Float +      // +      namespace +      { +        struct FloatInit +        { +          FloatInit () +          { +            type_info ti (typeid (Float)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } float_init_; +      } + +      Float:: +      Float (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Double +      // +      namespace +      { +        struct DoubleInit +        { +          DoubleInit () +          { +            type_info ti (typeid (Double)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } double_init_; +      } + +      Double:: +      Double (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Decimal +      // +      namespace +      { +        struct DecimalInit +        { +          DecimalInit () +          { +            type_info ti (typeid (Decimal)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } decimal_init_; +      } + +      Decimal:: +      Decimal (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // String +      // +      namespace +      { +        struct StringInit +        { +          StringInit () +          { +            type_info ti (typeid (String)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } string_init_; +      } + +      String:: +      String (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // NormalizedString +      // +      namespace +      { +        struct NormalizedStringInit +        { +          NormalizedStringInit () +          { +            type_info ti (typeid (NormalizedString)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } normalized_string_init_; +      } + +      NormalizedString:: +      NormalizedString (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Token +      // +      namespace +      { +        struct TokenInit +        { +          TokenInit () +          { +            type_info ti (typeid (Token)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } token_init_; +      } + +      Token:: +      Token (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Name +      // +      namespace +      { +        struct NameInit +        { +          NameInit () +          { +            type_info ti (typeid (Name)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } name_init_; +      } + +      Name:: +      Name (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // NameToken +      // +      namespace +      { +        struct NameTokenInit +        { +          NameTokenInit () +          { +            type_info ti (typeid (NameToken)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } name_token_init_; +      } + +      NameToken:: +      NameToken (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // NameTokens +      // +      namespace +      { +        struct NameTokensInit +        { +          NameTokensInit () +          { +            type_info ti (typeid (NameTokens)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } name_tokens_init_; +      } + +      NameTokens:: +      NameTokens (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // NCName +      // +      namespace +      { +        struct NCNameInit +        { +          NCNameInit () +          { +            type_info ti (typeid (NCName)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } NC_name_init_; +      } + +      NCName:: +      NCName (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Language +      // +      namespace +      { +        struct LanguageInit +        { +          LanguageInit () +          { +            type_info ti (typeid (Language)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } language_init_; +      } + +      Language:: +      Language (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // QName +      // +      namespace +      { +        struct QNameInit +        { +          QNameInit () +          { +            type_info ti (typeid (QName)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } q_name_init_; +      } + +      QName:: +      QName (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Id +      // +      namespace +      { +        struct IdInit +        { +          IdInit () +          { +            type_info ti (typeid (Id)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } id_init_; +      } + +      Id:: +      Id (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // IdRef +      // +      namespace +      { +        struct IdRefInit +        { +          IdRefInit () +          { +            type_info ti (typeid (IdRef)); +	    ti.add_base (typeid (Type)); +            ti.add_base (typeid (Specialization)); +            insert (ti); +          } + +        } id_ref_init_; +      } + +      IdRef:: +      IdRef (Path const& file, +             unsigned long line, +             unsigned long column) +          : Node (file, line, column) +      { +      } + + +      // IdRefs +      // +      namespace +      { +        struct IdRefsInit +        { +          IdRefsInit () +          { +            type_info ti (typeid (IdRefs)); +	    ti.add_base (typeid (Type)); +            ti.add_base (typeid (Specialization)); +            insert (ti); +          } + +        } id_refs_init_; +      } + +      IdRefs:: +      IdRefs (Path const& file, +              unsigned long line, +              unsigned long column) +          : Node (file, line, column) +      { +      } + + +      // AnyURI +      // +      namespace +      { +        struct AnyURIInit +        { +          AnyURIInit () +          { +            type_info ti (typeid (AnyURI)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } any_URI_init_; +      } + +      AnyURI:: +      AnyURI (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Base64Binary +      // +      namespace +      { +        struct Base64BinaryInit +        { +          Base64BinaryInit () +          { +            type_info ti (typeid (Base64Binary)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } base_64_binary_init_; +      } + +      Base64Binary:: +      Base64Binary (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // HexBinary +      // +      namespace +      { +        struct HexBinaryInit +        { +          HexBinaryInit () +          { +            type_info ti (typeid (HexBinary)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } hex_binary_init_; +      } + +      HexBinary:: +      HexBinary (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Date +      // +      namespace +      { +        struct DateInit +        { +          DateInit () +          { +            type_info ti (typeid (Date)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } date_init_; +      } + +      Date:: +      Date (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // DateTime +      // +      namespace +      { +        struct DateTimeInit +        { +          DateTimeInit () +          { +            type_info ti (typeid (DateTime)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } date_time_init_; +      } + +      DateTime:: +      DateTime (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Duration +      // +      namespace +      { +        struct DurationInit +        { +          DurationInit () +          { +            type_info ti (typeid (Duration)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } duration_init_; +      } + +      Duration:: +      Duration (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Day +      // +      namespace +      { +        struct DayInit +        { +          DayInit () +          { +            type_info ti (typeid (Day)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } day_init_; +      } + +      Day:: +      Day (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Month +      // +      namespace +      { +        struct MonthInit +        { +          MonthInit () +          { +            type_info ti (typeid (Month)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } month_init_; +      } + +      Month:: +      Month (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // MonthDay +      // +      namespace +      { +        struct MonthDayInit +        { +          MonthDayInit () +          { +            type_info ti (typeid (MonthDay)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } month_day_init_; +      } + +      MonthDay:: +      MonthDay (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Year +      // +      namespace +      { +        struct YearInit +        { +          YearInit () +          { +            type_info ti (typeid (Year)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } year_init_; +      } + +      Year:: +      Year (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // YearMonth +      // +      namespace +      { +        struct YearMonthInit +        { +          YearMonthInit () +          { +            type_info ti (typeid (YearMonth)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } year_month_init_; +      } + +      YearMonth:: +      YearMonth (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Time +      // +      namespace +      { +        struct TimeInit +        { +          TimeInit () +          { +            type_info ti (typeid (Time)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } time_init_; +      } + +      Time:: +      Time (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Entity +      // +      namespace +      { +        struct EntityInit +        { +          EntityInit () +          { +            type_info ti (typeid (Entity)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } entity_init_; +      } + +      Entity:: +      Entity (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Entities +      // +      namespace +      { +        struct EntitiesInit +        { +          EntitiesInit () +          { +            type_info ti (typeid (Entities)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } entities_init_; +      } + +      Entities:: +      Entities (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } + + +      // Notation +      // +      namespace +      { +        struct NotationInit +        { +          NotationInit () +          { +            type_info ti (typeid (Notation)); +            ti.add_base (typeid (Type)); +            insert (ti); +          } + +        } notation_init_; +      } + +      Notation:: +      Notation (Path const& file, +          unsigned long line, +          unsigned long column) +        : Node (file, line, column) +      { +      } +    } +  } +} diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.cxx.m4 b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.cxx.m4 index cc1316c..c336ab8 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.cxx.m4 +++ b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.cxx.m4 @@ -1,8 +1,7 @@  divert(-1)  # file      : xsd-frontend/semantic-graph/fundamental.cxx.m4 -# author    : Boris Kolpackov <boris@codesynthesis.com> -# copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +# copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  # license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  include(`fundamental.m4') @@ -21,9 +20,9 @@ define(`fundamental_type_impl', `          {            $1Init ()            { -            TypeInfo ti (typeid ($1)); -            ti.add_base (Access::public_, true, typeid (Type)); -            RTTI::insert (ti); +            type_info ti (typeid ($1)); +            ti.add_base (typeid (Type)); +            insert (ti);            }          } $2_init_; @@ -31,8 +30,8 @@ define(`fundamental_type_impl', `        $1::        $1 (Path const& file, -          SemanticGraph::UnsignedLong line, -          SemanticGraph::UnsignedLong column) +          unsigned long line, +          unsigned long column)          : Node (file, line, column)        {        }') @@ -42,13 +41,14 @@ dnl  dnl  dnl  // file      : xsd-frontend/semantic-graph/fundamental.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  // Note, that this file is automatically generated!  // +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/fundamental.hxx>  namespace XSDFrontend @@ -57,11 +57,7 @@ namespace XSDFrontend    {      namespace Fundamental      { -      namespace RTTI = Cult::RTTI; - -      using RTTI::Access; -      using RTTI::TypeInfo; - +      using compiler::type_info;        // Type        // @@ -71,11 +67,10 @@ namespace XSDFrontend          {            TypeInit ()            { -            TypeInfo ti (typeid (Type)); -            ti.add_base (Access::public_, true, typeid (SemanticGraph::Type)); -            RTTI::insert (ti); +            type_info ti (typeid (Type)); +            ti.add_base (typeid (SemanticGraph::Type)); +            insert (ti);            } -          } any_type_init_;        } @@ -138,10 +133,10 @@ fundamental_type(`id')          {            IdRefInit ()            { -            TypeInfo ti (typeid (IdRef)); -	    ti.add_base (Access::public_, true, typeid (Type)); -            ti.add_base (Access::public_, true, typeid (Specialization)); -            RTTI::insert (ti); +            type_info ti (typeid (IdRef)); +	    ti.add_base (typeid (Type)); +            ti.add_base (typeid (Specialization)); +            insert (ti);            }          } id_ref_init_; @@ -149,8 +144,8 @@ fundamental_type(`id')        IdRef::        IdRef (Path const& file, -             SemanticGraph::UnsignedLong line, -             SemanticGraph::UnsignedLong column) +             unsigned long line, +             unsigned long column)            : Node (file, line, column)        {        } @@ -164,10 +159,10 @@ fundamental_type(`id')          {            IdRefsInit ()            { -            TypeInfo ti (typeid (IdRefs)); -	    ti.add_base (Access::public_, true, typeid (Type)); -            ti.add_base (Access::public_, true, typeid (Specialization)); -            RTTI::insert (ti); +            type_info ti (typeid (IdRefs)); +	    ti.add_base (typeid (Type)); +            ti.add_base (typeid (Specialization)); +            insert (ti);            }          } id_refs_init_; @@ -175,8 +170,8 @@ fundamental_type(`id')        IdRefs::        IdRefs (Path const& file, -              SemanticGraph::UnsignedLong line, -              SemanticGraph::UnsignedLong column) +              unsigned long line, +              unsigned long column)            : Node (file, line, column)        {        } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.hxx new file mode 100644 index 0000000..d810824 --- /dev/null +++ b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.hxx @@ -0,0 +1,516 @@ +// file      : xsd-frontend/semantic-graph/fundamental.hxx +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +// Note, that this file is automatically generated! +// + +#ifndef XSD_FRONTEND_SEMANTIC_GRAPH_FUNDAMENTAL_HXX +#define XSD_FRONTEND_SEMANTIC_GRAPH_FUNDAMENTAL_HXX + +#include <xsd-frontend/semantic-graph/elements.hxx> + +namespace XSDFrontend +{ +  namespace SemanticGraph +  { +    namespace Fundamental +    { +      // +      // +      class Type: public virtual SemanticGraph::Type +      { +      protected: +        Type (); +      }; + + +      // +      // +      class Byte: public virtual Type +      { +      public: +        Byte (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class UnsignedByte: public virtual Type +      { +      public: +        UnsignedByte (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Short: public virtual Type +      { +      public: +        Short (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class UnsignedShort: public virtual Type +      { +      public: +        UnsignedShort (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Int: public virtual Type +      { +      public: +        Int (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class UnsignedInt: public virtual Type +      { +      public: +        UnsignedInt (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Long: public virtual Type +      { +      public: +        Long (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class UnsignedLong: public virtual Type +      { +      public: +        UnsignedLong (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Integer: public virtual Type +      { +      public: +        Integer (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class NonPositiveInteger: public virtual Type +      { +      public: +        NonPositiveInteger (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class NonNegativeInteger: public virtual Type +      { +      public: +        NonNegativeInteger (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class PositiveInteger: public virtual Type +      { +      public: +        PositiveInteger (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class NegativeInteger: public virtual Type +      { +      public: +        NegativeInteger (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Boolean: public virtual Type +      { +      public: +        Boolean (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Float: public virtual Type +      { +      public: +        Float (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Double: public virtual Type +      { +      public: +        Double (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Decimal: public virtual Type +      { +      public: +        Decimal (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class String: public virtual Type +      { +      public: +        String (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class NormalizedString: public virtual Type +      { +      public: +        NormalizedString (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Token: public virtual Type +      { +      public: +        Token (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Name: public virtual Type +      { +      public: +        Name (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class NameToken: public virtual Type +      { +      public: +        NameToken (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class NameTokens: public virtual Type +      { +      public: +        NameTokens (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class NCName: public virtual Type +      { +      public: +        NCName (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Language: public virtual Type +      { +      public: +        Language (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class QName: public virtual Type +      { +      public: +        QName (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Id: public virtual Type +      { +      public: +        Id (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class IdRef: public virtual Type, +                   public virtual Specialization +      { +      public: +        IdRef (Path const& file, +               unsigned long line, +               unsigned long column); +      }; + + +      // +      // +      class IdRefs: public virtual Type, +                    public virtual Specialization +      { +      public: +        IdRefs (Path const& file, +                unsigned long line, +                unsigned long column); +      }; + + +      // +      // +      class AnyURI: public virtual Type +      { +      public: +        AnyURI (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Base64Binary: public virtual Type +      { +      public: +        Base64Binary (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class HexBinary: public virtual Type +      { +      public: +        HexBinary (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Date: public virtual Type +      { +      public: +        Date (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class DateTime: public virtual Type +      { +      public: +        DateTime (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Duration: public virtual Type +      { +      public: +        Duration (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Day: public virtual Type +      { +      public: +        Day (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Month: public virtual Type +      { +      public: +        Month (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class MonthDay: public virtual Type +      { +      public: +        MonthDay (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Year: public virtual Type +      { +      public: +        Year (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class YearMonth: public virtual Type +      { +      public: +        YearMonth (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Time: public virtual Type +      { +      public: +        Time (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Entity: public virtual Type +      { +      public: +        Entity (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Entities: public virtual Type +      { +      public: +        Entities (Path const& file, +            unsigned long line, +            unsigned long column); +      }; + + +      // +      // +      class Notation: public virtual Type +      { +      public: +        Notation (Path const& file, +            unsigned long line, +            unsigned long column); +      }; +    } +  } +} + +#endif  // XSD_FRONTEND_SEMANTIC_GRAPH_FUNDAMENTAL_HXX diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.hxx.m4 b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.hxx.m4 index f5a88a9..52c9c89 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.hxx.m4 +++ b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.hxx.m4 @@ -1,8 +1,7 @@  divert(-1)  # file      : xsd-frontend/semantic-graph/fundamental.hxx.m4 -# author    : Boris Kolpackov <boris@codesynthesis.com> -# copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +# copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  # license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  include(`fundamental.m4') @@ -15,20 +14,17 @@ define(`fundamental_type_impl', `        //        class $1: public virtual Type        { -      protected: -        friend class Bits::Graph<Node, Edge>; - +      public:          $1 (Path const& file, -            SemanticGraph::UnsignedLong line, -            SemanticGraph::UnsignedLong column); +            unsigned long line, +            unsigned long column);        };')  divert(0)dnl  dnl  dnl  dnl  // file      : xsd-frontend/semantic-graph/fundamental.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  // Note, that this file is automatically generated! @@ -50,8 +46,6 @@ namespace XSDFrontend        class Type: public virtual SemanticGraph::Type        {        protected: -        friend class Bits::Graph<Node, Edge>; -          Type ();        };  dnl @@ -106,12 +100,10 @@ fundamental_type(`id')        class IdRef: public virtual Type,                     public virtual Specialization        { -      protected: -        friend class Bits::Graph<Node, Edge>; - +      public:          IdRef (Path const& file, -               SemanticGraph::UnsignedLong line, -               SemanticGraph::UnsignedLong column); +               unsigned long line, +               unsigned long column);        }; @@ -120,12 +112,10 @@ fundamental_type(`id')        class IdRefs: public virtual Type,                      public virtual Specialization        { -      protected: -        friend class Bits::Graph<Node, Edge>; - +      public:          IdRefs (Path const& file, -                SemanticGraph::UnsignedLong line, -                SemanticGraph::UnsignedLong column); +                unsigned long line, +                unsigned long column);        };  dnl  dnl URI. diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.m4 b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.m4 index 735b35d..b9243f7 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.m4 +++ b/libxsd-frontend/xsd-frontend/semantic-graph/fundamental.m4 @@ -1,6 +1,5 @@  # file      : xsd-frontend/semantic-graph/fundamental.m4 -# author    : Boris Kolpackov <boris@codesynthesis.com> -# copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +# copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  # license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  define(`upcase', `translit(`$*', `a-z', `A-Z')') diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/list.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/list.cxx index 3184041..f62f617 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/list.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/list.cxx @@ -1,37 +1,34 @@  // file      : xsd-frontend/semantic-graph/list.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/list.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; +    List:: +    List (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    }      namespace      { +      using compiler::type_info; +        struct ListInit        {          ListInit ()          { -          TypeInfo ti (typeid (List)); -          ti.add_base (Access::public_, true, typeid (Specialization)); -          RTTI::insert (ti); +          type_info ti (typeid (List)); +          ti.add_base (typeid (Specialization)); +          insert (ti);          } -        } list_init_;      } - -    List:: -    List (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/list.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/list.hxx index 3ba0c02..d7f370f 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/list.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/list.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/list.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_LIST_HXX @@ -14,10 +13,8 @@ namespace XSDFrontend    {      class List: public virtual Specialization      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      List (Path const& file, UnsignedLong line, UnsignedLong column); +    public: +      List (Path const& file, unsigned long line, unsigned long column);      };    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/namespace.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/namespace.cxx index 789b5d8..e33a892 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/namespace.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/namespace.cxx @@ -1,37 +1,34 @@  // file      : xsd-frontend/semantic-graph/namespace.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/namespace.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; +    Namespace:: +    Namespace (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    }      namespace      { +      using compiler::type_info; +        struct NamespaceInit        {          NamespaceInit ()          { -          TypeInfo ti (typeid (Namespace)); -          ti.add_base (Access::public_, true, typeid (Scope)); -          RTTI::insert (ti); +          type_info ti (typeid (Namespace)); +          ti.add_base (typeid (Scope)); +          insert (ti);          } -        } namespace_init_;      } - -    Namespace:: -    Namespace (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/namespace.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/namespace.hxx index 25bd1c0..ccc9d61 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/namespace.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/namespace.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/namespace.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_NAMESPACE_HXX @@ -14,15 +13,11 @@ namespace XSDFrontend    {      class Namespace : public virtual Scope      { -    protected: -      friend class Bits::Graph<Node, Edge>; +    public: +      Namespace (Path const& file, unsigned long line, unsigned long column); -      Namespace (Path const& file, UnsignedLong line, UnsignedLong column); - -      Void -      add_edge_right (BelongsToNamespace&) -      { -      } +      void +      add_edge_right (BelongsToNamespace&) {}        using Scope::add_edge_right;      }; diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/particle.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/particle.cxx index f8c93de..c3269e6 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/particle.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/particle.cxx @@ -1,61 +1,54 @@  // file      : xsd-frontend/semantic-graph/particle.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/particle.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; -      // ContainsParticle      // -    namespace -    { -      struct ContainsParticleInit -      { -        ContainsParticleInit () -        { -          TypeInfo ti (typeid (ContainsParticle)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); -        } - -      } contains_particle_init_; -    } -      ContainsParticle:: -    ContainsParticle (UnsignedLong min, UnsignedLong max) +    ContainsParticle (unsigned long min, unsigned long max)          : particle_ (0), compositor_ (0), min_ (min), max_ (max)      {      }      // Particle      // +    Particle:: +    Particle () +        : contained_particle_ (0) +    { +    } +      namespace      { +      using compiler::type_info; + +      struct ContainsParticleInit +      { +        ContainsParticleInit () +        { +          type_info ti (typeid (ContainsParticle)); +          ti.add_base (typeid (Edge)); +          insert (ti); +        } +      } contains_particle_init_; +        struct ParticleInit        {          ParticleInit ()          { -          TypeInfo ti (typeid (Particle)); -          ti.add_base (Access::public_, true, typeid (Node)); -          RTTI::insert (ti); +          type_info ti (typeid (Particle)); +          ti.add_base (typeid (Node)); +          insert (ti);          } -        } particle_init_;      } - -    Particle:: -    Particle () -        : contained_particle_ (0) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/particle.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/particle.hxx index df48de4..a7f0755 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/particle.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/particle.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/particle.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_PARTICLE_HXX @@ -36,43 +35,41 @@ namespace XSDFrontend        }      public: -      UnsignedLong +      unsigned long        min () const        {          return min_;        } -      UnsignedLong +      unsigned long        max () const        {          return max_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      ContainsParticle (UnsignedLong min, UnsignedLong max); +    public: +      ContainsParticle (unsigned long min, unsigned long max); -      Void +      void        set_left_node (Compositor& n)        {          compositor_ = &n;        } -      Void +      void        set_right_node (Particle& n)        {          particle_ = &n;        } -      Void +      void        clear_left_node (Compositor& n)        {          assert (compositor_ == &n);          compositor_ = 0;        } -      Void +      void        clear_right_node (Particle& n)        {          assert (particle_ == &n); @@ -82,7 +79,7 @@ namespace XSDFrontend      private:        Particle* particle_;        Compositor* compositor_; -      UnsignedLong min_, max_; +      unsigned long min_, max_;      };      // @@ -90,7 +87,7 @@ namespace XSDFrontend      class Particle: public virtual Node      {      public: -      Boolean +      bool        contained_particle_p ()        {          return contained_particle_ != 0; @@ -104,32 +101,30 @@ namespace XSDFrontend        }      public: -      UnsignedLong +      unsigned long        min () const        {          assert (contained_particle_ != 0);          return contained_particle_->min ();        } -      UnsignedLong +      unsigned long        max () const        {          assert (contained_particle_ != 0);          return contained_particle_->max ();        } -    protected: -      friend class Bits::Graph<Node, Edge>; - +    public:        Particle (); -      Void +      void        add_edge_right (ContainsParticle& e)        {          contained_particle_ = &e;        } -      Void +      void        remove_edge_right (ContainsParticle& e)        {          assert (contained_particle_ == &e); diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx index f812797..d1cbf25 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/schema.cxx @@ -1,32 +1,64 @@  // file      : xsd-frontend/semantic-graph/schema.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/schema.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; +    // Schema +    // +    Schema::NamesIteratorPair Schema:: +    find (Name const& name) const +    { +      // Here we are going to create an illusion that the namespace +      // hierarchy is flat. +      names_.clear (); +      schemas_.clear (); + +      find_ (name, names_, schemas_); + +      return NamesIteratorPair (NamesConstIterator (names_.begin ()), +                                NamesConstIterator (names_.end ())); +    } + +    void Schema:: +    find_ (Name const& name, NamesList& names, SchemaSet& set) const +    { +      set.insert (this); + +      // Check our own namespace first so it will end up first in the list. +      // +      NamesIteratorPair pair (Scope::find (name)); +      names.insert (names.end (), pair.first.base (), pair.second.base ()); -    using RTTI::Access; -    using RTTI::TypeInfo; +      for (UsesIterator i (uses_begin ()), end (uses_end ()); i != end; ++i) +      { +        Schema& s (i->schema ()); + +        if (set.find (&s) == set.end ()) +          s.find_ (name, names, set); +      } +    }      namespace      { +      using compiler::type_info; +        // Uses        //        struct UsesInit        {          UsesInit ()          { -          TypeInfo ti (typeid (Uses)); -          ti.add_base (Access::public_, true, typeid (Edge)); -          RTTI::insert (ti); +          type_info ti (typeid (Uses)); +          ti.add_base (typeid (Edge)); +          insert (ti);          } -        } uses_init_; @@ -36,11 +68,10 @@ namespace XSDFrontend        {          ImpliesInit ()          { -          TypeInfo ti (typeid (Implies)); -          ti.add_base (Access::public_, true, typeid (Uses)); -          RTTI::insert (ti); +          type_info ti (typeid (Implies)); +          ti.add_base (typeid (Uses)); +          insert (ti);          } -        } implies_init_; @@ -50,11 +81,10 @@ namespace XSDFrontend        {          SourcesInit ()          { -          TypeInfo ti (typeid (Sources)); -          ti.add_base (Access::public_, true, typeid (Uses)); -          RTTI::insert (ti); +          type_info ti (typeid (Sources)); +          ti.add_base (typeid (Uses)); +          insert (ti);          } -        } sources_init_; @@ -64,11 +94,10 @@ namespace XSDFrontend        {          IncludesInit ()          { -          TypeInfo ti (typeid (Includes)); -          ti.add_base (Access::public_, true, typeid (Uses)); -          RTTI::insert (ti); +          type_info ti (typeid (Includes)); +          ti.add_base (typeid (Uses)); +          insert (ti);          } -        } includes_init_; @@ -78,11 +107,10 @@ namespace XSDFrontend        {          ImportsInit ()          { -          TypeInfo ti (typeid (Imports)); -          ti.add_base (Access::public_, true, typeid (Uses)); -          RTTI::insert (ti); +          type_info ti (typeid (Imports)); +          ti.add_base (typeid (Uses)); +          insert (ti);          } -        } imports_init_; @@ -92,48 +120,11 @@ namespace XSDFrontend        {          SchemaInit ()          { -          TypeInfo ti (typeid (Schema)); -          ti.add_base (Access::public_, true, typeid (Scope)); -          RTTI::insert (ti); +          type_info ti (typeid (Schema)); +          ti.add_base (typeid (Scope)); +          insert (ti);          } -        } schema_init_;      } - - -    // Schema -    // -    Schema::NamesIteratorPair Schema:: -    find (Name const& name) const -    { -      // Here we are going to create an illusion that the namespace -      // hierarchy is flat. -      names_.clear (); -      schemas_.clear (); - -      find_ (name, names_, schemas_); - -      return NamesIteratorPair (NamesConstIterator (names_.begin ()), -                                NamesConstIterator (names_.end ())); -    } - -    Void Schema:: -    find_ (Name const& name, NamesList& names, SchemaSet& set) const -    { -      set.insert (this); - -      // Check our own namespace first so it will end up first in the list. -      // -      NamesIteratorPair pair (Scope::find (name)); -      names.insert (names.end (), pair.first.base (), pair.second.base ()); - -      for (UsesIterator i (uses_begin ()), end (uses_end ()); i != end; ++i) -      { -        Schema& s (i->schema ()); - -        if (set.find (&s) == set.end ()) -          s.find_ (name, names, set); -      } -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx index 10d2f75..803c870 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/schema.hxx @@ -1,12 +1,12 @@  // file      : xsd-frontend/semantic-graph/schema.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_SCHEMA_HXX  #define XSD_FRONTEND_SEMANTIC_GRAPH_SCHEMA_HXX -#include <cult/containers/set.hxx> +#include <set> +#include <vector>  #include <xsd-frontend/semantic-graph/elements.hxx>  #include <xsd-frontend/semantic-graph/namespace.hxx> @@ -15,11 +15,8 @@ namespace XSDFrontend  {    namespace SemanticGraph    { -    // -    //      class Schema; -      class Uses: public virtual Edge      {      public: @@ -41,21 +38,16 @@ namespace XSDFrontend          return path_;        } -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Uses (Path const& path) -          : path_ (path) -      { -      } +    public: +      Uses (Path const& path): path_ (path) {} -      Void +      void        set_left_node (Schema& s)        {          user_ = &s;        } -      Void +      void        set_right_node (Schema& s)        {          schema_ = &s; @@ -72,13 +64,8 @@ namespace XSDFrontend      //      class Implies: public virtual Uses      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Implies (Path const& path) -          : Uses (path) -      { -      } +    public: +      Implies (Path const& path): Uses (path) {}      }; @@ -86,13 +73,8 @@ namespace XSDFrontend      //      class Sources: public virtual Uses      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Sources (Path const& path) -          : Uses (path) -      { -      } +    public: +      Sources (Path const& path): Uses (path) {}      }; @@ -100,13 +82,8 @@ namespace XSDFrontend      //      class Includes: public virtual Uses      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Includes (Path const& path) -          : Uses (path) -      { -      } +    public: +      Includes (Path const& path): Uses (path) {}      }; @@ -114,40 +91,29 @@ namespace XSDFrontend      //      class Imports: public virtual Uses      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Imports (Path const& path) -          : Uses (path) -      { -      } +    public: +      Imports (Path const& path): Uses (path) {}      }; -      //      // -    class Schema: public virtual Scope, -                  private Bits::Graph<Node, Edge>, -                  public NonCopyable +    class Schema: public graph, public virtual Scope      { -      typedef -      Cult::Containers::Vector<Uses*> -      UsesList; - -      typedef -      Cult::Containers::Vector<Uses*> -      UsedList; +      typedef std::vector<Uses*> UsesList; +      typedef std::vector<Uses*> UsedList;      public: -      Schema (Path const& file, UnsignedLong line, UnsignedLong column) -          : SemanticGraph::Node (file, line, column) +      Schema (Path const& file, unsigned long line, unsigned long column) +          : Node (file, line, column), graph_ (*this)        {        } +    private: +      Schema (Schema const&); +      Schema& operator= (Schema const&); +      public: -      typedef -      Bits::PointerIterator<UsesList::ConstIterator> -      UsesIterator; +      typedef pointer_iterator<UsesList::const_iterator> UsesIterator;        UsesIterator        uses_begin () const @@ -161,9 +127,8 @@ namespace XSDFrontend          return uses_.end ();        } -      typedef -      Bits::PointerIterator<UsedList::ConstIterator> -      UsedIterator; +    public: +      typedef pointer_iterator<UsedList::const_iterator> UsedIterator;        UsedIterator        used_begin () const @@ -177,7 +142,7 @@ namespace XSDFrontend          return used_.end ();        } -      Boolean +      bool        used_p () const        {          return used_begin () != used_end (); @@ -187,90 +152,81 @@ namespace XSDFrontend        find (Name const& name) const;      public: -      using Bits::Graph<SemanticGraph::Node, Edge>::new_edge; -      using Bits::Graph<SemanticGraph::Node, Edge>::reset_left_node; -      using Bits::Graph<SemanticGraph::Node, Edge>::reset_right_node; -      using Bits::Graph<SemanticGraph::Node, Edge>::add_edge_left; -      using Bits::Graph<SemanticGraph::Node, Edge>::add_edge_right; -      using Bits::Graph<SemanticGraph::Node, Edge>::delete_node; -      using Bits::Graph<SemanticGraph::Node, Edge>::delete_edge; +      using graph::new_edge; +      using graph::reset_left_node; +      using graph::reset_right_node; +      using graph::add_edge_left; +      using graph::add_edge_right; +      using graph::delete_node; +      using graph::delete_edge;        template <typename T>        T& -      new_node (Path const& file, UnsignedLong line, UnsignedLong column) +      new_node (Path const& file, unsigned long line, unsigned long column)        { -        return graph ().new_node<T> (file, line, column); +        return graph_.new_node<T> (file, line, column);        }        template <typename T, typename A0>        T& -      new_node (Path const& file, UnsignedLong line, UnsignedLong column, +      new_node (Path const& file, unsigned long line, unsigned long column,                  A0 const& a0)        { -        return graph ().new_node<T> (file, line, column, a0); +        return graph_.new_node<T> (file, line, column, a0);        }        template <typename T, typename A0, typename A1>        T& -      new_node (Path const& file, UnsignedLong line, UnsignedLong column, +      new_node (Path const& file, unsigned long line, unsigned long column,                  A0 const& a0, A1 const& a1)        { -        return graph ().new_node<T> (file, line, column, a0, a1); +        return graph_.new_node<T> (file, line, column, a0, a1);        }        template <typename T, typename A0, typename A1, typename A2>        T& -      new_node (Path const& file, UnsignedLong line, UnsignedLong column, +      new_node (Path const& file, unsigned long line, unsigned long column,                  A0 const& a0, A1 const& a1, A2 const& a2)        { -        return graph ().new_node<T> (file, line, column, a0, a1, a2); +        return graph_.new_node<T> (file, line, column, a0, a1, a2);        }        template <typename T, typename A0, typename A1, typename A2,                  typename A3>        T& -      new_node (Path const& file, UnsignedLong line, UnsignedLong column, +      new_node (Path const& file, unsigned long line, unsigned long column,                  A0 const& a0, A1 const& a1, A2 const& a2, A3 const& a3)        { -        return graph ().new_node<T> (file, line, column, a0, a1, a2, a3); +        return graph_.new_node<T> (file, line, column, a0, a1, a2, a3);        } -    protected: -      //@@ gcc bug #21146 -      // -      friend class Bits::Graph<SemanticGraph::Node, Edge>; - +    public:        using Scope::add_edge_left;        using Node::add_edge_right; -      Void +      void        add_edge_left (Uses& e)        {          uses_.push_back (&e);        } -      Void +      void        add_edge_right (Uses& e)        {          used_.push_back (&e);        }      private: -      Bits::Graph<SemanticGraph::Node, Edge>& -      graph () -      { -        return *this; -      } +      typedef std::set<Schema const*> SchemaSet; -    private: -      UsesList uses_; -      UsedList used_; +      void +      find_ (Name const& name, NamesList&, SchemaSet&) const;      private: -      typedef Cult::Containers::Set<Schema const*> SchemaSet; +      graph& graph_; -      Void -      find_ (Name const& name, NamesList&, SchemaSet&) const; +      UsesList uses_; +      UsedList used_;        mutable NamesList names_;        mutable SchemaSet schemas_; diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/union.cxx b/libxsd-frontend/xsd-frontend/semantic-graph/union.cxx index b4b4cf0..4e7436d 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/union.cxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/union.cxx @@ -1,37 +1,34 @@  // file      : xsd-frontend/semantic-graph/union.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file +#include <cutl/compiler/type-info.hxx> +  #include <xsd-frontend/semantic-graph/union.hxx>  namespace XSDFrontend  {    namespace SemanticGraph    { -    namespace RTTI = Cult::RTTI; - -    using RTTI::Access; -    using RTTI::TypeInfo; +    Union:: +    Union (Path const& file, unsigned long line, unsigned long column) +        : Node (file, line, column) +    { +    }      namespace      { +      using compiler::type_info; +        struct UnionInit        {          UnionInit ()          { -          TypeInfo ti (typeid (Union)); -          ti.add_base (Access::public_, true, typeid (Specialization)); -          RTTI::insert (ti); +          type_info ti (typeid (Union)); +          ti.add_base (typeid (Specialization)); +          insert (ti);          } -        } union_init_;      } - -    Union:: -    Union (Path const& file, UnsignedLong line, UnsignedLong column) -        : Node (file, line, column) -    { -    }    }  } diff --git a/libxsd-frontend/xsd-frontend/semantic-graph/union.hxx b/libxsd-frontend/xsd-frontend/semantic-graph/union.hxx index 62df730..d7ba385 100644 --- a/libxsd-frontend/xsd-frontend/semantic-graph/union.hxx +++ b/libxsd-frontend/xsd-frontend/semantic-graph/union.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/semantic-graph/union.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_SEMANTIC_GRAPH_UNION_HXX @@ -14,10 +13,8 @@ namespace XSDFrontend    {      class Union: public virtual Specialization      { -    protected: -      friend class Bits::Graph<Node, Edge>; - -      Union (Path const& file, UnsignedLong line, UnsignedLong column); +    public: +      Union (Path const& file, unsigned long line, unsigned long column);      };    }  } diff --git a/libxsd-frontend/xsd-frontend/transformations/anonymous.cxx b/libxsd-frontend/xsd-frontend/transformations/anonymous.cxx index 118fd5d..1c42d98 100644 --- a/libxsd-frontend/xsd-frontend/transformations/anonymous.cxx +++ b/libxsd-frontend/xsd-frontend/transformations/anonymous.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/transformations/anonymous.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/transformations/anonymous.hxx> @@ -10,27 +9,281 @@  #include <iostream>  #include <sstream> +#include <typeinfo>  using std::wcerr;  using std::endl;  namespace XSDFrontend  { -  using namespace Cult; - -  typedef WideString String; -    namespace    {      using Transformations::AnonymousNameTranslator; +    // +    // +    struct CompareMembers: Traversal::Element, +                           Traversal::Attribute, +                           Traversal::Any, +                           Traversal::AnyAttribute +    { +      CompareMembers (SemanticGraph::Nameable& m, bool& r) +          : member_ (m), result_ (r) +      { +      } + +      virtual void +      traverse (SemanticGraph::Element& x) +      { +        using SemanticGraph::Element; + +        Element& y (dynamic_cast<Element&> (member_)); + +        // Check cardinalities. +        // +        if (x.min () != y.min () || x.max () != y.max ()) +          return; + +        traverse_member (x); +      } + +      virtual void +      traverse (SemanticGraph::Attribute& x) +      { +        using SemanticGraph::Attribute; + +        Attribute& y (dynamic_cast<Attribute&> (member_)); + +        // Check cardinalities. +        // +        if (x.optional_p () != y.optional_p ()) +          return; + +        traverse_member (x); +      } + +      virtual void +      traverse_member (SemanticGraph::Member& x) +      { +        using SemanticGraph::Member; + +        Member& y (dynamic_cast<Member&> (member_)); + +        // Check name. +        // +        if (x.name () != y.name ()) +          return; + +        // Check namespace. +        // +        if (x.qualified_p () || y.qualified_p ()) +        { +          if (!x.qualified_p () || !y.qualified_p ()) +            return; + +          if (x.namespace_ ().name () != y.namespace_ ().name ()) +            return; +        } + +        // Check type. +        // +        // @@ What if types are anonymous and structurally equal? +        // +        if (&x.type () != &y.type ()) +          return; + +        // Check default/fixed values. +        // +        if (x.default_p () != y.default_p () || x.fixed_p () != y.fixed_p ()) +          return; + +        if (x.default_p () && x.value () != y.value ()) +          return; + +        result_ = true; +      } + +      virtual void +      traverse (SemanticGraph::Any&) +      { +        //@@ TODO +      } + +      virtual void +      traverse (SemanticGraph::AnyAttribute&) +      { +        //@@ TODO +      } + +    private: +      SemanticGraph::Nameable& member_; +      bool& result_; +    }; + +    // Compare two types for structural equality. +    // +    struct CompareTypes: Traversal::List, +                         Traversal::Union, +                         Traversal::Enumeration, +                         Traversal::Complex +    { +      CompareTypes (SemanticGraph::Type& t, bool& r) +          : type_ (t), result_ (r) +      { +      } + + +      virtual void +      traverse (SemanticGraph::List&) +      { +        using SemanticGraph::List; + +        //List& y (dynamic_cast<List&> (type_)); +      } + +      virtual void +      traverse (SemanticGraph::Union& x) +      { +        using SemanticGraph::Union; + +        Union& y (dynamic_cast<Union&> (type_)); + +        Union::ArgumentedIterator ix (x.argumented_begin ()), +          iy (y.argumented_begin ()); + +        for (; ix != x.argumented_end () && iy != y.argumented_end (); +             ++ix, ++iy) +        { +          // @@ Anon structurally equivalent. +          // +          if (&iy->type () != &ix->type ()) +            return; +        } + +        result_ = true; +      } + +      virtual void +      traverse (SemanticGraph::Enumeration& x) +      { +        using SemanticGraph::Enumeration; + +        Enumeration& y (dynamic_cast<Enumeration&> (type_)); + +        // Bases should be the same. +        // +        if (&x.inherits ().base () != &y.inherits ().base ()) +          return; + +        // Make sure facets match. +        // +        using SemanticGraph::Restricts; + +        Restricts& rx (dynamic_cast<Restricts&> (x.inherits ())); +        Restricts& ry (dynamic_cast<Restricts&> (y.inherits ())); + +        if (rx.facets () != ry.facets ()) +          return; + +        // Compare enumerators. +        // +        using SemanticGraph::Scope; + +        Scope::NamesIterator ix (x.names_begin ()), iy (y.names_begin ()); +        for (; ix != x.names_end () && iy != y.names_end (); ++ix, ++iy) +        { +          if (ix->name () != iy->name ()) +            return; +        } + +        if (ix != x.names_end () || iy != y.names_end ()) +          return; + +        result_ = true; +      } + +      virtual void +      traverse (SemanticGraph::Complex& x) +      { +        using SemanticGraph::Complex; + +        Complex& y (dynamic_cast<Complex&> (type_)); + +        // Check inheritance. +        // +        if (x.inherits_p () || y.inherits_p ()) +        { +          // They both must inherits. +          // +          if (!x.inherits_p () || !y.inherits_p ()) +            return; + +          // With the same kind of inheritance (restriction or extension). +          // +          if (typeid (x.inherits ()) != typeid (y.inherits ())) +            return; + +          // Bases should be the same. +          // +          // @@ What if bases are anonymous? +          // +          if (&x.inherits ().base () != &y.inherits ().base ()) +            return; + +          // If it is a restriction, make sure facets match. +          // +          using SemanticGraph::Restricts; + +          if (x.inherits ().is_a<Restricts> ()) +          { +            Restricts& rx (dynamic_cast<Restricts&> (x.inherits ())); +            Restricts& ry (dynamic_cast<Restricts&> (y.inherits ())); + +            if (rx.facets () != ry.facets ()) +              return; +          } +        } + +        // Check the member list. +        // +        // @@ Ignoring compositors at the moment. +        // +        using SemanticGraph::Scope; + +        Scope::NamesIterator ix (x.names_begin ()), iy (y.names_begin ()); +        for (; ix != x.names_end () && iy != y.names_end (); ++ix, ++iy) +        { +          if (typeid (ix->named ()) != typeid (iy->named ())) +            return; + +          bool equal (false); +          CompareMembers t (iy->named (), equal); +          t.dispatch (ix->named ()); + +          if (!equal) +            return; +        } + +        if (ix != x.names_end () || iy != y.names_end ()) +          return; + +        result_ = true; +      } + +    private: +      SemanticGraph::Type& type_; +      bool& result_; +    }; + +    // +    //      class Context      {      public:        Context (SemanticGraph::Schema& schema_,                 SemanticGraph::Path const& file,                 AnonymousNameTranslator& trans_, -               Boolean du) +               bool du)            : schema_path_ (file),              ns_ (0),              failed_ (false), @@ -56,6 +309,19 @@ namespace XSDFrontend        }      public: + +      bool +      structurally_equal (SemanticGraph::Type& x, SemanticGraph::Type& y) +      { +        if (typeid (x) != typeid (y)) +           return false; + +        bool r (false); +        CompareTypes t (y, r); +        t.dispatch (x); +        return r; +      } +        struct UnstableConflict        {          UnstableConflict (SemanticGraph::Type& type) @@ -73,7 +339,7 @@ namespace XSDFrontend          SemanticGraph::Type& type_;        }; -      Boolean +      SemanticGraph::Type*        conflict (String const& name)        {          using SemanticGraph::Type; @@ -96,10 +362,10 @@ namespace XSDFrontend                throw UnstableConflict (*t1);            } -          return true; +          return t1;          } -        return false; +        return 0;        }        SemanticGraph::Type* @@ -179,17 +445,17 @@ namespace XSDFrontend      private:        SemanticGraph::Path const schema_path_;        SemanticGraph::Namespace* ns_; -      Boolean failed_; +      bool failed_;      public:        AnonymousNameTranslator& trans; -      Boolean detect_unstable; +      bool detect_unstable;      public:        SemanticGraph::Schema& schema;        SemanticGraph::Path const& schema_path;        SemanticGraph::Namespace*& ns; -      Boolean& failed; +      bool& failed;      }; @@ -198,7 +464,7 @@ namespace XSDFrontend      //      struct Uses: Traversal::Uses      { -      virtual Void +      virtual void        traverse (Type& u)        {          SemanticGraph::Schema& s (u.schema ()); @@ -220,13 +486,13 @@ namespace XSDFrontend        {        } -      Void +      void        pre (SemanticGraph::Namespace& ns)        {          ns_ = &ns;        } -      Void +      void        post (SemanticGraph::Namespace&)        {          ns_ = 0; @@ -248,7 +514,7 @@ namespace XSDFrontend        {        } -      virtual Void +      virtual void        traverse (SemanticGraph::List& l)        {          SemanticGraph::Type& t (l.argumented ().type ()); @@ -264,6 +530,7 @@ namespace XSDFrontend              // Run the name through the translation service.              //              SemanticGraph::Path file (path (l)); +            file.normalize ();              String file_str;              // Try to use the portable representation of the path. If that @@ -271,15 +538,11 @@ namespace XSDFrontend              //              try              { -              file_str = file.string (); +              file_str = file.posix_string ();              }              catch (SemanticGraph::InvalidPath const&)              { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -              file_str = file.native_file_string (); -#else                file_str = file.string (); -#endif              }              String name ( @@ -288,7 +551,7 @@ namespace XSDFrontend              // Make sure the name is unique.              // -            UnsignedLong n (1); +            unsigned long n (1);              String escaped (name);              while (conflict (escaped)) @@ -330,7 +593,7 @@ namespace XSDFrontend          }        } -      virtual Void +      virtual void        traverse (SemanticGraph::Union& u)        {          String file_str; @@ -352,21 +615,18 @@ namespace XSDFrontend                if (!file_str)                {                  SemanticGraph::Path file (path (u)); +                file.normalize ();                  // Try to use the portable representation of the path. If                  // that fails, fall back to the native representation.                  //                  try                  { -                  file_str = file.string (); +                  file_str = file.posix_string ();                  }                  catch (SemanticGraph::InvalidPath const&)                  { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -                  file_str = file.native_file_string (); -#else                    file_str = file.string (); -#endif                  }                } @@ -376,7 +636,7 @@ namespace XSDFrontend                // Make sure the name is unique.                // -              UnsignedLong n (1); +              unsigned long n (1);                String escaped (name);                while (conflict (escaped)) @@ -419,7 +679,7 @@ namespace XSDFrontend          }        } -      virtual Void +      virtual void        traverse (SemanticGraph::Complex& c)        {          if (!c.inherits_p ()) @@ -438,6 +698,7 @@ namespace XSDFrontend              // Run the name through the translation service.              //              SemanticGraph::Path file (path (c)); +            file.normalize ();              String file_str;              // Try to use the portable representation of the path. If that @@ -445,15 +706,11 @@ namespace XSDFrontend              //              try              { -              file_str = file.string (); +              file_str = file.posix_string ();              }              catch (SemanticGraph::InvalidPath const&)              { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -              file_str = file.native_file_string (); -#else                file_str = file.string (); -#endif              }              String name ( @@ -462,7 +719,7 @@ namespace XSDFrontend              // Make sure the name is unique.              // -            UnsignedLong n (1); +            unsigned long n (1);              String escaped (name);              while (conflict (escaped)) @@ -517,7 +774,7 @@ namespace XSDFrontend        {        } -      virtual Void +      virtual void        traverse (SemanticGraph::Element& e)        {          SemanticGraph::Type& t (e.type ()); @@ -560,7 +817,7 @@ namespace XSDFrontend          }        } -      virtual Void +      virtual void        traverse (SemanticGraph::Attribute& a)        {          SemanticGraph::Type& t (a.type ()); @@ -603,7 +860,7 @@ namespace XSDFrontend          }        } -      Void +      void        traverse_ (SemanticGraph::Member& m)        {          using SemanticGraph::Type; @@ -640,6 +897,7 @@ namespace XSDFrontend          // Run the name through the translation service.          //          SemanticGraph::Path file (path (m)); +        file.normalize ();          String file_str;          // Try to use the portable representation of the path. If that @@ -647,27 +905,46 @@ namespace XSDFrontend          //          try          { -          file_str = file.string (); +          file_str = file.posix_string ();          }          catch (SemanticGraph::InvalidPath const&)          { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -          file_str = file.native_file_string (); -#else            file_str = file.string (); -#endif          }          String name (            trans.translate (file_str, ns->name (), m.name (), xpath (m))); -        // Make sure the name is unique. +        // Check if this name conflicts.          // -        UnsignedLong n (1); +        unsigned long n (1);          String escaped (name); -        while (conflict (escaped)) +        while (SemanticGraph::Type* other = conflict (escaped))          { +          // First see if we should just use the other type. It should +          // also have been anonymous and structurally equal to our type. +          // +          if (other->context ().count ("anonymous")) +          { +            if (structurally_equal (t, *other)) +            { +              // Reset the elements that are classified by this type to point +              // to the other type. +              // +              for (Type::ClassifiesIterator i (t.classifies_begin ()); +                   i != t.classifies_end (); ++i) +              { +                schema.reset_right_node (*i, *other); +              } + +              //wcerr << "equal " << name << endl; +              return; +            } +            //else +              //wcerr << "unequal " << name << endl; +          } +            std::wostringstream os;            os << n++;            escaped = name + os.str (); @@ -687,10 +964,10 @@ namespace XSDFrontend      {      } -    Void Anonymous:: +    void Anonymous::      transform (SemanticGraph::Schema& s,                 SemanticGraph::Path const& f, -               Boolean duc) +               bool duc)      {        Context ctx (s, f, trans_, duc); diff --git a/libxsd-frontend/xsd-frontend/transformations/anonymous.hxx b/libxsd-frontend/xsd-frontend/transformations/anonymous.hxx index 2409822..cafd187 100644 --- a/libxsd-frontend/xsd-frontend/transformations/anonymous.hxx +++ b/libxsd-frontend/xsd-frontend/transformations/anonymous.hxx @@ -1,12 +1,11 @@  // file      : xsd-frontend/transformations/anonymous.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRANSFORMATIONS_ANONYMOUS_HXX  #define XSD_FRONTEND_TRANSFORMATIONS_ANONYMOUS_HXX -#include <cult/types.hxx> +#include <xsd-frontend/types.hxx>  #include <xsd-frontend/semantic-graph/elements.hxx> // Path  #include <xsd-frontend/semantic-graph/schema.hxx> @@ -15,8 +14,6 @@ namespace XSDFrontend  {    namespace Transformations    { -    using namespace Cult::Types; -      class AnonymousNameTranslator      {      public: @@ -26,11 +23,11 @@ namespace XSDFrontend        // The file argument is empty for the currect translation        // unit.        // -      virtual WideString -      translate (WideString const& file, -                 WideString const& ns, -                 WideString const& name, -                 WideString const& xpath) = 0; +      virtual String +      translate (String const& file, +                 String const& ns, +                 String const& name, +                 String const& xpath) = 0;      };      // This transformation morphs anonymous types into named ones @@ -46,10 +43,10 @@ namespace XSDFrontend        Anonymous (AnonymousNameTranslator&); -      Void +      void        transform (SemanticGraph::Schema&,                   SemanticGraph::Path const&, -                 Boolean detect_unstable_conflicts); +                 bool detect_unstable_conflicts);      private:        AnonymousNameTranslator& trans_; diff --git a/libxsd-frontend/xsd-frontend/transformations/enum-synthesis.cxx b/libxsd-frontend/xsd-frontend/transformations/enum-synthesis.cxx index e10b9d3..26ad16c 100644 --- a/libxsd-frontend/xsd-frontend/transformations/enum-synthesis.cxx +++ b/libxsd-frontend/xsd-frontend/transformations/enum-synthesis.cxx @@ -1,23 +1,19 @@  // file      : xsd-frontend/transformations/enum-synthesis.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file -#include <xsd-frontend/transformations/enum-synthesis.hxx> +#include <set>  #include <xsd-frontend/semantic-graph.hxx>  #include <xsd-frontend/traversal.hxx> -#include <cult/containers/set.hxx> +#include <xsd-frontend/transformations/enum-synthesis.hxx>  namespace XSDFrontend  { -  using namespace Cult; -  typedef WideString String; -    namespace    { -    typedef Cult::Containers::Set<String> Enumerators; +    typedef std::set<String> Enumerators;      struct Enumerator: Traversal::Enumerator      { @@ -28,7 +24,7 @@ namespace XSDFrontend        {        } -      virtual Void +      virtual void        traverse (Type& e)        {          String const& name (e.name ()); @@ -64,7 +60,7 @@ namespace XSDFrontend        {        } -      virtual Void +      virtual void        traverse (Type& u)        {          using SemanticGraph::Enumeration; @@ -208,7 +204,7 @@ namespace XSDFrontend      //      struct Uses: Traversal::Uses      { -      virtual Void +      virtual void        traverse (Type& u)        {          SemanticGraph::Schema& s (u.schema ()); @@ -224,7 +220,7 @@ namespace XSDFrontend    namespace Transformations    { -    Void EnumSynthesis:: +    void EnumSynthesis::      transform (SemanticGraph::Schema& s, SemanticGraph::Path const&)      {        Traversal::Schema schema; diff --git a/libxsd-frontend/xsd-frontend/transformations/enum-synthesis.hxx b/libxsd-frontend/xsd-frontend/transformations/enum-synthesis.hxx index e3c38c7..9f0f970 100644 --- a/libxsd-frontend/xsd-frontend/transformations/enum-synthesis.hxx +++ b/libxsd-frontend/xsd-frontend/transformations/enum-synthesis.hxx @@ -1,12 +1,11 @@  // file      : xsd-frontend/transformations/enum-synthesis.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRANSFORMATIONS_ENUM_SYNTHESIS_HXX  #define XSD_FRONTEND_TRANSFORMATIONS_ENUM_SYNTHESIS_HXX -#include <cult/types.hxx> +#include <xsd-frontend/types.hxx>  #include <xsd-frontend/semantic-graph/elements.hxx> // Path  #include <xsd-frontend/semantic-graph/schema.hxx> @@ -15,8 +14,6 @@ namespace XSDFrontend  {    namespace Transformations    { -    using namespace Cult::Types; -      // This transformation replaces unions of one or more enumerations      // with the same base with an equivalent synthesized enumeration.      // This transformation assumes that there are no anonymous types. @@ -24,7 +21,7 @@ namespace XSDFrontend      class EnumSynthesis      {      public: -      Void +      void        transform (SemanticGraph::Schema&, SemanticGraph::Path const&);      };    } diff --git a/libxsd-frontend/xsd-frontend/transformations/restriction.cxx b/libxsd-frontend/xsd-frontend/transformations/restriction.cxx index c58d98f..edd74be 100644 --- a/libxsd-frontend/xsd-frontend/transformations/restriction.cxx +++ b/libxsd-frontend/xsd-frontend/transformations/restriction.cxx @@ -1,27 +1,21 @@  // file      : xsd-frontend/transformations/restriction.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file -#include <xsd-frontend/transformations/restriction.hxx> +#include <vector> +#include <iostream>  #include <xsd-frontend/semantic-graph.hxx>  #include <xsd-frontend/traversal.hxx> -#include <cult/containers/vector.hxx> - -#include <iostream> +#include <xsd-frontend/transformations/restriction.hxx> -using std::wcerr; -using std::endl; +using namespace std;  namespace XSDFrontend  { -  using namespace Cult; - -  typedef WideString String;    typedef Transformations::Restriction::Failed Failed; -  typedef Containers::Vector<SemanticGraph::Complex*> BaseList; +  typedef std::vector<SemanticGraph::Complex*> BaseList;    namespace    { @@ -34,7 +28,7 @@ namespace XSDFrontend        {        } -      virtual Void +      virtual void        traverse (Type& c)        {          using namespace SemanticGraph; @@ -107,7 +101,7 @@ namespace XSDFrontend              else              {                Compositor::ContainsIterator i (root.contains_begin ()); -              BaseList::ReverseIterator j (base_model.rbegin ()); +              BaseList::reverse_iterator j (base_model.rbegin ());                for (; i != root.contains_end (); ++i, ++j)                { @@ -153,7 +147,7 @@ namespace XSDFrontend        }      private: -      Void +      void        handle (SemanticGraph::Particle& r, SemanticGraph::Particle& b)        {          using namespace SemanticGraph; @@ -215,7 +209,7 @@ namespace XSDFrontend          }        } -      Boolean +      bool        match (SemanticGraph::Particle& r, SemanticGraph::Particle& b)        {          using namespace SemanticGraph; @@ -282,7 +276,7 @@ namespace XSDFrontend          return false;        } -      Void +      void        merge_attributes (SemanticGraph::Complex& c,                          SemanticGraph::Complex& base)        { @@ -364,12 +358,12 @@ namespace XSDFrontend          }        } -      Void +      void        handle_any_attributes (SemanticGraph::Complex& c, BaseList& bl)        {          using namespace SemanticGraph; -        BaseList::ReverseIterator bi (bl.rbegin ()), be (bl.rend ()); +        BaseList::reverse_iterator bi (bl.rbegin ()), be (bl.rend ());          Scope::NamesIterator si;          if (bi != be) @@ -432,14 +426,14 @@ namespace XSDFrontend      struct Anonymous : Traversal::Element,                         Traversal::Attribute      { -      Anonymous (Traversal::NodeDispatcherBase& d1) +      Anonymous (Traversal::NodeDispatcher& d1)            : complex_ (&d1, 0)        {          *this >> belongs_ >> complex_;        } -      Anonymous (Traversal::NodeDispatcherBase& d1, -                 Traversal::NodeDispatcherBase& d2) +      Anonymous (Traversal::NodeDispatcher& d1, +                 Traversal::NodeDispatcher& d2)            : complex_ (&d1, &d2)        {          *this >> belongs_ >> complex_; @@ -460,7 +454,7 @@ namespace XSDFrontend      public: -      virtual Void +      virtual void        traverse (SemanticGraph::Element& e)        {          SemanticGraph::Type& t (e.type ()); @@ -479,7 +473,7 @@ namespace XSDFrontend          }        } -      virtual Void +      virtual void        traverse (SemanticGraph::Attribute& a)        {          SemanticGraph::Type& t (a.type ()); @@ -501,13 +495,13 @@ namespace XSDFrontend      private:        struct Complex : Traversal::Complex        { -        Complex (Traversal::NodeDispatcherBase* d1, -                 Traversal::NodeDispatcherBase* d2) +        Complex (Traversal::NodeDispatcher* d1, +                 Traversal::NodeDispatcher* d2)              : d1_ (d1), d2_ (d2)          {          } -        virtual Void +        virtual void          traverse (SemanticGraph::Complex& c)          {            if (d1_) @@ -518,8 +512,8 @@ namespace XSDFrontend          }        private: -        Traversal::NodeDispatcherBase* d1_; -        Traversal::NodeDispatcherBase* d2_; +        Traversal::NodeDispatcher* d1_; +        Traversal::NodeDispatcher* d2_;        } complex_; @@ -532,7 +526,7 @@ namespace XSDFrontend      //      struct Uses: Traversal::Uses      { -      virtual Void +      virtual void        traverse (Type& u)        {          SemanticGraph::Schema& s (u.schema ()); @@ -548,7 +542,7 @@ namespace XSDFrontend    namespace Transformations    { -    Void Restriction:: +    void Restriction::      transform (SemanticGraph::Schema& s, SemanticGraph::Path const&)      {        Traversal::Schema schema; diff --git a/libxsd-frontend/xsd-frontend/transformations/restriction.hxx b/libxsd-frontend/xsd-frontend/transformations/restriction.hxx index 7c3282e..6d7410c 100644 --- a/libxsd-frontend/xsd-frontend/transformations/restriction.hxx +++ b/libxsd-frontend/xsd-frontend/transformations/restriction.hxx @@ -1,12 +1,11 @@  // file      : xsd-frontend/transformations/restriction.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRANSFORMATIONS_RESTRICTION_HXX  #define XSD_FRONTEND_TRANSFORMATIONS_RESTRICTION_HXX -#include <cult/types.hxx> +#include <xsd-frontend/types.hxx>  #include <xsd-frontend/semantic-graph/elements.hxx> // Path  #include <xsd-frontend/semantic-graph/schema.hxx> @@ -15,8 +14,6 @@ namespace XSDFrontend  {    namespace Transformations    { -    using namespace Cult::Types; -      // This transformation performs two major tasks. It transfers omitted      // attribute declarations from the base to derived-by-restriction type      // and establishes correspondence between particles and compositors by @@ -30,7 +27,7 @@ namespace XSDFrontend      public:        struct Failed {}; -      Void +      void        transform (SemanticGraph::Schema&, SemanticGraph::Path const&);      };    } diff --git a/libxsd-frontend/xsd-frontend/transformations/schema-per-type.cxx b/libxsd-frontend/xsd-frontend/transformations/schema-per-type.cxx index 9ac8445..2fc14b5 100644 --- a/libxsd-frontend/xsd-frontend/transformations/schema-per-type.cxx +++ b/libxsd-frontend/xsd-frontend/transformations/schema-per-type.cxx @@ -1,48 +1,42 @@  // file      : xsd-frontend/transformations/schema-per-type.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file -#include <xsd-frontend/transformations/schema-per-type.hxx> - -#include <xsd-frontend/semantic-graph.hxx> -#include <xsd-frontend/traversal.hxx> +#include <strings.h> // strcasecmp -#include <cult/containers/map.hxx> -#include <cult/containers/set.hxx> -#include <cult/containers/vector.hxx> +#include <map> +#include <set> +#include <vector>  #include <sstream>  #include <iostream> -#include <strings.h> // strcasecmp +#include <xsd-frontend/semantic-graph.hxx> +#include <xsd-frontend/traversal.hxx> + +#include <xsd-frontend/transformations/schema-per-type.hxx>  using std::wcerr;  using std::endl;  namespace XSDFrontend  { -  using namespace Cult; - -  typedef WideString String;    typedef Transformations::SchemaPerType::Failed Failed; - -  typedef Containers::Vector<SemanticGraph::Schema*> Schemas; -  typedef Containers::Map<SemanticGraph::Type*, -                          SemanticGraph::Schema*> TypeSchemaMap; +  typedef std::vector<SemanticGraph::Schema*> Schemas; +  typedef std::map<SemanticGraph::Type*, SemanticGraph::Schema*> TypeSchemaMap;    // Compare file paths case-insensitively.    //    struct FileComparator    { -    Boolean +    bool      operator() (NarrowString const& x, NarrowString const& y) const      {        return strcasecmp (x.c_str (), y.c_str ()) < 0;      }    }; -  typedef Containers::Set<NarrowString, FileComparator> FileSet; +  typedef std::set<NarrowString, FileComparator> FileSet;    namespace    { @@ -59,7 +53,7 @@ namespace XSDFrontend          xsd_ = 0;        } -      virtual Void +      virtual void        traverse (SemanticGraph::Includes& i)        {          SemanticGraph::Schema& s (i.schema ()); @@ -72,7 +66,7 @@ namespace XSDFrontend          }        } -      virtual Void +      virtual void        traverse (SemanticGraph::Imports& i)        {          SemanticGraph::Schema& s (i.schema ()); @@ -85,7 +79,7 @@ namespace XSDFrontend          }        } -      virtual Void +      virtual void        traverse (SemanticGraph::Implies& i)        {          if (xsd_ == 0) @@ -97,12 +91,13 @@ namespace XSDFrontend        SemanticGraph::Schema*& xsd_;      }; -    Void +    void      process_schema (SemanticGraph::Schema& s,                      SemanticGraph::Schema& root,                      SemanticGraph::Schema& xsd,                      TypeSchemaMap& tsm,                      FileSet& file_set, +                    bool fat_type_file,                      Transformations::SchemaPerTypeTranslator& trans)      {        using namespace SemanticGraph; @@ -141,7 +136,7 @@ namespace XSDFrontend              //              if (!tn)              { -              for (NarrowString::Iterator i (base.begin ()), e (base.end ()); +              for (NarrowString::iterator i (base.begin ()), e (base.end ());                     i != e; ++i)                {                  if (*i == '/' || *i == '\\') @@ -153,7 +148,7 @@ namespace XSDFrontend              //              NarrowString file_name (base); -            for (UnsignedLong i (1); +            for (unsigned long i (1);                   file_set.find (file_name) != file_set.end ();                   ++i)              { @@ -167,11 +162,7 @@ namespace XSDFrontend              try              { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2                path = Path (file_name); -#else -              path = Path (file_name.c_str()); -#endif              }              catch (InvalidPath const&)              { @@ -184,7 +175,7 @@ namespace XSDFrontend                throw Failed ();              }            } -          catch (String::NonRepresentable const&) +          catch (NonRepresentable const&)            {              wcerr << "error: '" << wbase << "' cannot be represented as a "                    << "narrow string" << endl; @@ -195,6 +186,8 @@ namespace XSDFrontend              throw Failed ();            } +          Type& t (dynamic_cast<Type&> (n)); +            Schema& ts (root.new_node<Schema> (path, 1, 1));            root.new_edge<Implies> (ts, xsd, xsd_path); @@ -202,11 +195,43 @@ namespace XSDFrontend            root.new_edge<Names> (ts, tns, ns.name ());            root.new_edge<Names> (tns, n, name); +          // If we are generating fat type files, then also move the global +          // elements this type classifies to the new schema. +          // +          if (fat_type_file) +          { +            for (Type::ClassifiesIterator j (t.classifies_begin ()); +                 j != t.classifies_end (); ++j) +            { +              Instance& e (j->instance ()); + +              // We can only move a global element from the same namespace. +              // +              if (e.is_a<Element> () && +                  e.scope ().is_a<Namespace> () && +                  e.scope ().name () == ns.name ()) +              { +                Names& n (e.named ()); +                String name (n.name ()); + +                // Watch out for the iterator validity: the edge we are +                // about to remove can be from the same list we are +                // currently iterating. +                // +                if (i != ns.names_end () && &*i == &n) +                  ++i; + +                root.delete_edge (n.scope (), e, n); +                root.new_edge<Names> (tns, e, name); +              } +            } +          } +            // Add include to the original schema and enter into the            // type-schema map.            //            root.new_edge<Includes> (s, ts, path); -          tsm[&dynamic_cast<Type&> (n)] = &ts; +          tsm[&t] = &ts;          }          else            ++i; @@ -219,7 +244,7 @@ namespace XSDFrontend      {        Type (SemanticGraph::Schema& schema,              SemanticGraph::Schema& root, -            Char const* by_value_key, +            char const* by_value_key,              TypeSchemaMap& tsm)            : schema_ (schema),              root_ (root), @@ -229,7 +254,7 @@ namespace XSDFrontend          *this >> names_ >> *this;        } -      virtual Void +      virtual void        traverse (SemanticGraph::List& l)        {          // Treat item type as base type since it is impossible @@ -239,7 +264,7 @@ namespace XSDFrontend          set_dep (t, false);        } -      virtual Void +      virtual void        traverse (SemanticGraph::Complex& c)        {          if (c.inherits_p ()) @@ -248,26 +273,26 @@ namespace XSDFrontend          Traversal::Complex::names (c);        } -      virtual Void +      virtual void        traverse (SemanticGraph::Member& m)        {          SemanticGraph::Type& t (m.type ()); -        Boolean weak ( +        bool weak (            by_value_key_ == 0 ||            !t.context ().count (by_value_key_) || -          !t.context ().get<Boolean> (by_value_key_)); +          !t.context ().get<bool> (by_value_key_));          set_dep (t, weak);        }      private: -      Void -      set_dep (SemanticGraph::Type& t, Boolean weak) +      void +      set_dep (SemanticGraph::Type& t, bool weak)        {          using namespace SemanticGraph; -        TypeSchemaMap::Iterator i (tsm_.find (&t)); +        TypeSchemaMap::iterator i (tsm_.find (&t));          // If a type is not present in the map then it must be          // a built-in type. @@ -301,9 +326,9 @@ namespace XSDFrontend      private:        SemanticGraph::Schema& schema_;        SemanticGraph::Schema& root_; -      Char const* by_value_key_; +      char const* by_value_key_;        TypeSchemaMap& tsm_; -      Containers::Set<SemanticGraph::Type*> type_set_; +      std::set<SemanticGraph::Type*> type_set_;        Traversal::Names names_;      }; @@ -312,8 +337,10 @@ namespace XSDFrontend    namespace Transformations    {      SchemaPerType:: -    SchemaPerType (SchemaPerTypeTranslator& trans, Char const* by_value_key) -        : by_value_key_ (by_value_key), trans_ (trans) +    SchemaPerType (SchemaPerTypeTranslator& trans, +                   bool fat, +                   char const* key) +        : fat_type_file_ (fat), by_value_key_ (key), trans_ (trans)      {      } @@ -344,8 +371,10 @@ namespace XSDFrontend        //        FileSet file_set; -      for (Schemas::Iterator i (schemas.begin ()); i != schemas.end (); ++i) +      for (Schemas::iterator i (schemas.begin ()); i != schemas.end (); ++i)        { +        // This path was already normalized by the parser. +        //          SemanticGraph::Path const& path (            (*i)->context ().get<SemanticGraph::Path> ("absolute-path")); @@ -353,31 +382,22 @@ namespace XSDFrontend          //          NarrowString abs_path; -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2          // Try to use the portable representation of the path. If that          // fails, fall back to the native representation.          //          try          { -          abs_path = path.string (); +          abs_path = path.posix_string ();          }          catch (SemanticGraph::InvalidPath const&)          { -          abs_path = path.native_file_string (); +          abs_path = path.string ();          } -#else -        // The new ABI does not have a fallback native representation -        abs_path = path.string (); -#endif          NarrowString tf (trans_.translate_schema (abs_path)); -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2 -        NarrowString file (tf ? tf : path.leaf ()); -#else -        NarrowString file (tf ? tf : path.filename ().string()); -#endif +        NarrowString file (tf ? tf : path.leaf ().string ()); -        Size p (file.rfind ('.')); +        size_t p (file.rfind ('.'));          NarrowString ext (            p != NarrowString::npos ? NarrowString (file, p) : ""); @@ -388,7 +408,7 @@ namespace XSDFrontend          //          NarrowString new_name (base); -        for (UnsignedLong n (1); +        for (unsigned long n (1);               file_set.find (new_name) != file_set.end ();               ++n)          { @@ -402,11 +422,7 @@ namespace XSDFrontend          try          { -#if !defined(BOOST_FILESYSTEM_VERSION) || BOOST_FILESYSTEM_VERSION == 2            (*i)->context ().set ("renamed", SemanticGraph::Path (new_name)); -#else -          (*i)->context ().set ("renamed", SemanticGraph::Path (new_name.c_str())); -#endif          }          catch (SemanticGraph::InvalidPath const&)          { @@ -424,9 +440,9 @@ namespace XSDFrontend        //        TypeSchemaMap tsm; -      for (Schemas::Iterator i (schemas.begin ()); i != schemas.end (); ++i) +      for (Schemas::iterator i (schemas.begin ()); i != schemas.end (); ++i)        { -        process_schema (**i, root, *xsd, tsm, file_set, trans_); +        process_schema (**i, root, *xsd, tsm, file_set, fat_type_file_, trans_);        }        // wcerr << tsm.size () << " type schema nodes" << endl; @@ -434,7 +450,7 @@ namespace XSDFrontend        // Establish include/import dependencies. While at it add the        // new schemas to the list which we will return.        // -      for (TypeSchemaMap::Iterator i (tsm.begin ()); i != tsm.end (); ++i) +      for (TypeSchemaMap::iterator i (tsm.begin ()); i != tsm.end (); ++i)        {          SemanticGraph::Schema& s (*i->second);          Type t (s, root, by_value_key_, tsm); diff --git a/libxsd-frontend/xsd-frontend/transformations/schema-per-type.hxx b/libxsd-frontend/xsd-frontend/transformations/schema-per-type.hxx index 89b6d83..8b6a69e 100644 --- a/libxsd-frontend/xsd-frontend/transformations/schema-per-type.hxx +++ b/libxsd-frontend/xsd-frontend/transformations/schema-per-type.hxx @@ -1,13 +1,13 @@  // file      : xsd-frontend/transformations/schema-per-type.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRANSFORMATIONS_SCHEMA_PER_TYPE_HXX  #define XSD_FRONTEND_TRANSFORMATIONS_SCHEMA_PER_TYPE_HXX -#include <cult/types.hxx> -#include <cult/containers/vector.hxx> +#include <vector> + +#include <xsd-frontend/types.hxx>  #include <xsd-frontend/semantic-graph/elements.hxx> // Path  #include <xsd-frontend/semantic-graph/schema.hxx> @@ -16,8 +16,6 @@ namespace XSDFrontend  {    namespace Transformations    { -    using namespace Cult::Types; -      class SchemaPerTypeTranslator      {      public: @@ -27,8 +25,8 @@ namespace XSDFrontend        // The following two functions should return empty string if        // there is no match.        // -      virtual WideString -      translate_type (WideString const& ns, WideString const& name) = 0; +      virtual String +      translate_type (String const& ns, String const& name) = 0;        virtual NarrowString        translate_schema (NarrowString const& abs_path) = 0; @@ -46,13 +44,16 @@ namespace XSDFrontend        // with the by_value_key key and it is true, then the schema        // for this type is included "strongly".        // -      SchemaPerType (SchemaPerTypeTranslator&, Char const* by_value_key = 0); +      SchemaPerType (SchemaPerTypeTranslator&, +                     bool fat_type_file, +                     char const* by_value_key = 0); -      Cult::Containers::Vector<SemanticGraph::Schema*> +      std::vector<SemanticGraph::Schema*>        transform (SemanticGraph::Schema&);      private: -      Char const* by_value_key_; +      bool fat_type_file_; +      char const* by_value_key_;        SchemaPerTypeTranslator& trans_;      };    } diff --git a/libxsd-frontend/xsd-frontend/transformations/simplifier.cxx b/libxsd-frontend/xsd-frontend/transformations/simplifier.cxx index 2ccaed2..9372a4a 100644 --- a/libxsd-frontend/xsd-frontend/transformations/simplifier.cxx +++ b/libxsd-frontend/xsd-frontend/transformations/simplifier.cxx @@ -1,19 +1,14 @@  // file      : xsd-frontend/transformations/simplifier.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file -#include <xsd-frontend/transformations/simplifier.hxx> -  #include <xsd-frontend/semantic-graph.hxx>  #include <xsd-frontend/traversal.hxx> -#include <cult/containers/vector.hxx> +#include <xsd-frontend/transformations/simplifier.hxx>  namespace XSDFrontend  { -  using namespace Cult; -    namespace    {      struct Compositor: Traversal::All, @@ -25,7 +20,7 @@ namespace XSDFrontend        {        } -      virtual Void +      virtual void        traverse (SemanticGraph::All& a)        {          // The all compositor cannot contain compositors. @@ -34,7 +29,7 @@ namespace XSDFrontend            remove (a);        } -      virtual Void +      virtual void        traverse (SemanticGraph::Choice& c)        {          // Do the depth-first traversal so that we take into account @@ -54,7 +49,7 @@ namespace XSDFrontend            remove (c);        } -      virtual Void +      virtual void        traverse (SemanticGraph::Sequence& s)        {          // Do the depth-first traversal so that we take into account @@ -73,7 +68,7 @@ namespace XSDFrontend        }      private: -      virtual Void +      virtual void        remove (SemanticGraph::Compositor& c)        {          using SemanticGraph::Node; @@ -106,7 +101,7 @@ namespace XSDFrontend      //      struct Type: Traversal::Complex      { -      virtual Void +      virtual void        traverse (SemanticGraph::Complex& c)        {          if (c.contains_compositor_p ()) @@ -119,7 +114,7 @@ namespace XSDFrontend      //      struct Uses: Traversal::Uses      { -      virtual Void +      virtual void        traverse (Type& u)        {          SemanticGraph::Schema& s (u.schema ()); @@ -135,7 +130,7 @@ namespace XSDFrontend    namespace Transformations    { -    Void Simplifier:: +    void Simplifier::      transform (SemanticGraph::Schema& s, SemanticGraph::Path const&)      {        Traversal::Schema schema; diff --git a/libxsd-frontend/xsd-frontend/transformations/simplifier.hxx b/libxsd-frontend/xsd-frontend/transformations/simplifier.hxx index 676c166..674ee45 100644 --- a/libxsd-frontend/xsd-frontend/transformations/simplifier.hxx +++ b/libxsd-frontend/xsd-frontend/transformations/simplifier.hxx @@ -1,12 +1,11 @@  // file      : xsd-frontend/transformations/simplifier.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRANSFORMATIONS_SIMPLIFIER_HXX  #define XSD_FRONTEND_TRANSFORMATIONS_SIMPLIFIER_HXX -#include <cult/types.hxx> +#include <xsd-frontend/types.hxx>  #include <xsd-frontend/semantic-graph/elements.hxx> // Path  #include <xsd-frontend/semantic-graph/schema.hxx> @@ -15,8 +14,6 @@ namespace XSDFrontend  {    namespace Transformations    { -    using namespace Cult::Types; -      // This transformation performs various schema simplifications      // (e.g., removing empty compositors, etc). This transformation      // assumes that there are no anonymous types. @@ -24,7 +21,7 @@ namespace XSDFrontend      class Simplifier      {      public: -      Void +      void        transform (SemanticGraph::Schema&, SemanticGraph::Path const&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal.hxx b/libxsd-frontend/xsd-frontend/traversal.hxx index 9b1c359..10190a1 100644 --- a/libxsd-frontend/xsd-frontend/traversal.hxx +++ b/libxsd-frontend/xsd-frontend/traversal.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_HXX diff --git a/libxsd-frontend/xsd-frontend/traversal/any-attribute.hxx b/libxsd-frontend/xsd-frontend/traversal/any-attribute.hxx index 55ed999..50655dd 100644 --- a/libxsd-frontend/xsd-frontend/traversal/any-attribute.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/any-attribute.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/any-attribute.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_ANY_ATTRIBUTE_HXX diff --git a/libxsd-frontend/xsd-frontend/traversal/any.hxx b/libxsd-frontend/xsd-frontend/traversal/any.hxx index 505d336..85a320d 100644 --- a/libxsd-frontend/xsd-frontend/traversal/any.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/any.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/any.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_ANY_HXX diff --git a/libxsd-frontend/xsd-frontend/traversal/attribute-group.cxx b/libxsd-frontend/xsd-frontend/traversal/attribute-group.cxx index e5c2237..a40afd7 100644 --- a/libxsd-frontend/xsd-frontend/traversal/attribute-group.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/attribute-group.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/attribute-group.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/attribute-group.hxx> @@ -9,7 +8,7 @@ namespace XSDFrontend  {    namespace Traversal    { -    Void AttributeGroup:: +    void AttributeGroup::      traverse (Type& g)      {        pre (g); @@ -17,12 +16,12 @@ namespace XSDFrontend        post (g);      } -    Void AttributeGroup:: +    void AttributeGroup::      pre (Type&)      {      } -    Void AttributeGroup:: +    void AttributeGroup::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/attribute-group.hxx b/libxsd-frontend/xsd-frontend/traversal/attribute-group.hxx index cd01a97..03fee14 100644 --- a/libxsd-frontend/xsd-frontend/traversal/attribute-group.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/attribute-group.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/attribute-group.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_ATTRIBUTE_GROUP_HXX @@ -15,13 +14,13 @@ namespace XSDFrontend    {      struct AttributeGroup: ScopeTemplate<SemanticGraph::AttributeGroup>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/attribute.cxx b/libxsd-frontend/xsd-frontend/traversal/attribute.cxx index c051667..e61eeb2 100644 --- a/libxsd-frontend/xsd-frontend/traversal/attribute.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/attribute.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/attribute.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/attribute.hxx> @@ -9,7 +8,7 @@ namespace XSDFrontend  {    namespace Traversal    { -    Void Attribute:: +    void Attribute::      traverse (Type& a)      {        pre (a); @@ -18,29 +17,29 @@ namespace XSDFrontend        post (a);      } -    Void Attribute:: +    void Attribute::      pre (Type&)      {      } -    Void Attribute:: -    belongs (Type& a, EdgeDispatcherBase& d) +    void Attribute:: +    belongs (Type& a, EdgeDispatcher& d)      {        d.dispatch (a.belongs ());      } -    Void Attribute:: +    void Attribute::      belongs (Type& a)      {        belongs (a, *this);      } -    Void Attribute:: +    void Attribute::      name (Type&)      {      } -    Void Attribute:: +    void Attribute::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/attribute.hxx b/libxsd-frontend/xsd-frontend/traversal/attribute.hxx index feb6b31..f3962e4 100644 --- a/libxsd-frontend/xsd-frontend/traversal/attribute.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/attribute.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/attribute.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_ATTRIBUTE_HXX @@ -17,22 +16,22 @@ namespace XSDFrontend    {      struct Attribute : Node<SemanticGraph::Attribute>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void -      belongs (Type&, EdgeDispatcherBase&); +      virtual void +      belongs (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        belongs (Type&); -      virtual Void +      virtual void        name (Type&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/complex.cxx b/libxsd-frontend/xsd-frontend/traversal/complex.cxx index d6cfc41..6e936ab 100644 --- a/libxsd-frontend/xsd-frontend/traversal/complex.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/complex.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/complex.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/complex.hxx> @@ -9,7 +8,7 @@ namespace XSDFrontend  {    namespace Traversal    { -    Void Complex:: +    void Complex::      traverse (Type& c)      {        pre (c); @@ -20,43 +19,43 @@ namespace XSDFrontend        post (c);      } -    Void Complex:: +    void Complex::      pre (Type&)      {      } -    Void Complex:: +    void Complex::      name (Type&)      {      } -    Void Complex:: +    void Complex::      inherits (Type& c)      {        inherits (c, *this);      } -    Void Complex:: -    inherits (Type& c, EdgeDispatcherBase& d) +    void Complex:: +    inherits (Type& c, EdgeDispatcher& d)      {        if (c.inherits_p ())          d.dispatch (c.inherits ());      } -    Void Complex:: +    void Complex::      contains_compositor (Type& c)      {        contains_compositor (c, *this);      } -    Void Complex:: -    contains_compositor (Type& c, EdgeDispatcherBase& d) +    void Complex:: +    contains_compositor (Type& c, EdgeDispatcher& d)      {        if (c.contains_compositor_p ())          d.dispatch (c.contains_compositor ());      } -    Void Complex:: +    void Complex::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/complex.hxx b/libxsd-frontend/xsd-frontend/traversal/complex.hxx index 3dd7e7b..1f55730 100644 --- a/libxsd-frontend/xsd-frontend/traversal/complex.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/complex.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/complex.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_COMPLEX_HXX @@ -15,28 +14,28 @@ namespace XSDFrontend    {      struct Complex : ScopeTemplate<SemanticGraph::Complex>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        name (Type&); -      virtual Void +      virtual void        inherits (Type&); -      Void -      inherits (Type&, EdgeDispatcherBase&); +      void +      inherits (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        contains_compositor (Type&); -      Void -      contains_compositor (Type&, EdgeDispatcherBase&); +      void +      contains_compositor (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/compositors.cxx b/libxsd-frontend/xsd-frontend/traversal/compositors.cxx index d3089fc..f2b3dcd 100644 --- a/libxsd-frontend/xsd-frontend/traversal/compositors.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/compositors.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/compositors.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/compositors.hxx> @@ -11,7 +10,7 @@ namespace XSDFrontend    {      // ContainsParticle      // -    Void ContainsParticle:: +    void ContainsParticle::      traverse (Type& c)      {        dispatch (c.particle ()); @@ -20,7 +19,7 @@ namespace XSDFrontend      // ContainsCompositor      // -    Void ContainsCompositor:: +    void ContainsCompositor::      traverse (Type& c)      {        dispatch (c.compositor ()); @@ -29,7 +28,7 @@ namespace XSDFrontend      // Compositor      // -    Void Compositor:: +    void Compositor::      traverse (Type& c)      {        pre (c); @@ -37,25 +36,25 @@ namespace XSDFrontend        post (c);      } -    Void Compositor:: +    void Compositor::      pre (Type&)      {      } -    Void Compositor:: +    void Compositor::      contains (Type& c)      {        iterate_and_dispatch (          c.contains_begin (), c.contains_end (), edge_traverser ());      } -    Void Compositor:: -    contains (Type& c, EdgeDispatcherBase& d) +    void Compositor:: +    contains (Type& c, EdgeDispatcher& d)      {        iterate_and_dispatch (c.contains_begin (), c.contains_end (), d);      } -    Void Compositor:: +    void Compositor::      post (Type&)      {      } @@ -63,7 +62,7 @@ namespace XSDFrontend      // All      // -    Void All:: +    void All::      traverse (Type& c)      {        pre (c); @@ -71,25 +70,25 @@ namespace XSDFrontend        post (c);      } -    Void All:: +    void All::      pre (Type&)      {      } -    Void All:: +    void All::      contains (Type& c)      {        iterate_and_dispatch (          c.contains_begin (), c.contains_end (), edge_traverser ());      } -    Void All:: -    contains (Type& c, EdgeDispatcherBase& d) +    void All:: +    contains (Type& c, EdgeDispatcher& d)      {        iterate_and_dispatch (c.contains_begin (), c.contains_end (), d);      } -    Void All:: +    void All::      post (Type&)      {      } @@ -97,7 +96,7 @@ namespace XSDFrontend      // Choice      // -    Void Choice:: +    void Choice::      traverse (Type& c)      {        pre (c); @@ -105,25 +104,25 @@ namespace XSDFrontend        post (c);      } -    Void Choice:: +    void Choice::      pre (Type&)      {      } -    Void Choice:: +    void Choice::      contains (Type& c)      {        iterate_and_dispatch (          c.contains_begin (), c.contains_end (), edge_traverser ());      } -    Void Choice:: -    contains (Type& c, EdgeDispatcherBase& d) +    void Choice:: +    contains (Type& c, EdgeDispatcher& d)      {        iterate_and_dispatch (c.contains_begin (), c.contains_end (), d);      } -    Void Choice:: +    void Choice::      post (Type&)      {      } @@ -131,7 +130,7 @@ namespace XSDFrontend      // Sequence      // -    Void Sequence:: +    void Sequence::      traverse (Type& c)      {        pre (c); @@ -139,25 +138,25 @@ namespace XSDFrontend        post (c);      } -    Void Sequence:: +    void Sequence::      pre (Type&)      {      } -    Void Sequence:: +    void Sequence::      contains (Type& c)      {        iterate_and_dispatch (          c.contains_begin (), c.contains_end (), edge_traverser ());      } -    Void Sequence:: -    contains (Type& c, EdgeDispatcherBase& d) +    void Sequence:: +    contains (Type& c, EdgeDispatcher& d)      {        iterate_and_dispatch (c.contains_begin (), c.contains_end (), d);      } -    Void Sequence:: +    void Sequence::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/compositors.hxx b/libxsd-frontend/xsd-frontend/traversal/compositors.hxx index e81460b..4761b99 100644 --- a/libxsd-frontend/xsd-frontend/traversal/compositors.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/compositors.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/compositors.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_COMPOSITORS_HXX @@ -26,7 +25,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type&);      }; @@ -44,7 +43,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type&);      }; @@ -52,19 +51,19 @@ namespace XSDFrontend      //      struct Compositor : Node<SemanticGraph::Compositor>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        contains (Type&); -      virtual Void -      contains (Type&, EdgeDispatcherBase&); +      virtual void +      contains (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        post (Type&);      }; @@ -73,19 +72,19 @@ namespace XSDFrontend      //      struct All : Node<SemanticGraph::All>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        contains (Type&); -      virtual Void -      contains (Type&, EdgeDispatcherBase&); +      virtual void +      contains (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        post (Type&);      }; @@ -94,19 +93,19 @@ namespace XSDFrontend      //      struct Choice : Node<SemanticGraph::Choice>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        contains (Type&); -      virtual Void -      contains (Type&, EdgeDispatcherBase&); +      virtual void +      contains (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        post (Type&);      }; @@ -115,19 +114,19 @@ namespace XSDFrontend      //      struct Sequence : Node<SemanticGraph::Sequence>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        contains (Type&); -      virtual Void -      contains (Type&, EdgeDispatcherBase&); +      virtual void +      contains (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/element-group.cxx b/libxsd-frontend/xsd-frontend/traversal/element-group.cxx index cb7a51a..0b253dd 100644 --- a/libxsd-frontend/xsd-frontend/traversal/element-group.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/element-group.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/element-group.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/element-group.hxx> @@ -9,7 +8,7 @@ namespace XSDFrontend  {    namespace Traversal    { -    Void ElementGroup:: +    void ElementGroup::      traverse (Type& g)      {        pre (g); @@ -18,24 +17,24 @@ namespace XSDFrontend        post (g);      } -    Void ElementGroup:: +    void ElementGroup::      pre (Type&)      {      } -    Void ElementGroup:: -    contains_compositor (Type& g, EdgeDispatcherBase& d) +    void ElementGroup:: +    contains_compositor (Type& g, EdgeDispatcher& d)      {        d.dispatch (g.contains_compositor ());      } -    Void ElementGroup:: +    void ElementGroup::      contains_compositor (Type& g)      {        contains_compositor (g, *this);      } -    Void ElementGroup:: +    void ElementGroup::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/element-group.hxx b/libxsd-frontend/xsd-frontend/traversal/element-group.hxx index 8ebe0bd..df13b26 100644 --- a/libxsd-frontend/xsd-frontend/traversal/element-group.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/element-group.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/element-group.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_ELEMENT_GROUP_HXX @@ -15,19 +14,19 @@ namespace XSDFrontend    {      struct ElementGroup: ScopeTemplate<SemanticGraph::ElementGroup>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        contains_compositor (Type&); -      virtual Void -      contains_compositor (Type&, EdgeDispatcherBase&); +      virtual void +      contains_compositor (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/element.cxx b/libxsd-frontend/xsd-frontend/traversal/element.cxx index 7f296ee..efdb0a6 100644 --- a/libxsd-frontend/xsd-frontend/traversal/element.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/element.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/element.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/element.hxx> @@ -9,7 +8,7 @@ namespace XSDFrontend  {    namespace Traversal    { -    Void Element:: +    void Element::      traverse (Type& m)      {        pre (m); @@ -18,29 +17,29 @@ namespace XSDFrontend        post (m);      } -    Void Element:: +    void Element::      pre (Type&)      {      } -    Void Element:: -    belongs (Type& m, EdgeDispatcherBase& d) +    void Element:: +    belongs (Type& m, EdgeDispatcher& d)      {        d.dispatch (m.belongs ());      } -    Void Element:: +    void Element::      belongs (Type& m)      {        belongs (m, edge_traverser ());      } -    Void Element:: +    void Element::      name (Type&)      {      } -    Void Element:: +    void Element::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/element.hxx b/libxsd-frontend/xsd-frontend/traversal/element.hxx index d5187ad..e1af29a 100644 --- a/libxsd-frontend/xsd-frontend/traversal/element.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/element.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/element.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_ELEMENT_HXX @@ -15,22 +14,22 @@ namespace XSDFrontend    {      struct Element : Node<SemanticGraph::Element>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void -      belongs (Type&, EdgeDispatcherBase&); +      virtual void +      belongs (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        belongs (Type&); -      virtual Void +      virtual void        name (Type&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/elements.cxx b/libxsd-frontend/xsd-frontend/traversal/elements.cxx index b1c47a0..e64e3b9 100644 --- a/libxsd-frontend/xsd-frontend/traversal/elements.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/elements.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/elements.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/elements.hxx> @@ -11,7 +10,7 @@ namespace XSDFrontend    {      // Instance      // -    Void Instance:: +    void Instance::      traverse (Type& a)      {        pre (a); @@ -19,24 +18,24 @@ namespace XSDFrontend        post (a);      } -    Void Instance:: +    void Instance::      pre (Type&)      {      } -    Void Instance:: -    belongs (Type& a, EdgeDispatcherBase& d) +    void Instance:: +    belongs (Type& a, EdgeDispatcher& d)      {        d.dispatch (a.belongs ());      } -    Void Instance:: +    void Instance::      belongs (Type& a)      {        belongs (a, edge_traverser ());      } -    Void Instance:: +    void Instance::      post (Type&)      {      } @@ -44,7 +43,7 @@ namespace XSDFrontend      // Member      // -    Void Member:: +    void Member::      traverse (Type& a)      {        pre (a); @@ -52,24 +51,24 @@ namespace XSDFrontend        post (a);      } -    Void Member:: +    void Member::      pre (Type&)      {      } -    Void Member:: -    belongs (Type& a, EdgeDispatcherBase& d) +    void Member:: +    belongs (Type& a, EdgeDispatcher& d)      {        d.dispatch (a.belongs ());      } -    Void Member:: +    void Member::      belongs (Type& a)      {        belongs (a, edge_traverser ());      } -    Void Member:: +    void Member::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/elements.hxx b/libxsd-frontend/xsd-frontend/traversal/elements.hxx index c405a1b..bd1dd70 100644 --- a/libxsd-frontend/xsd-frontend/traversal/elements.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/elements.hxx @@ -1,165 +1,97 @@  // file      : xsd-frontend/traversal/elements.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_ELEMENTS_HXX  #define XSD_FRONTEND_TRAVERSAL_ELEMENTS_HXX -#include <cult/types.hxx> - -#include <frontend-elements/traversal.hxx> +#include <cutl/compiler/traversal.hxx> +#include <xsd-frontend/types.hxx>  #include <xsd-frontend/semantic-graph/elements.hxx>  namespace XSDFrontend  {    namespace Traversal    { -    using namespace Cult::Types; - -    namespace Bits -    { -      using FrontendElements::Traversal::TraverserBase; -      using FrontendElements::Traversal::Traverser; - -      using FrontendElements::Traversal::DispatcherBase; -      using FrontendElements::Traversal::Dispatcher; - -    } - -    typedef Bits::DispatcherBase<SemanticGraph::Node> NodeDispatcherBase; -    typedef Bits::DispatcherBase<SemanticGraph::Edge> EdgeDispatcherBase; +    using namespace cutl; +    typedef compiler::dispatcher<SemanticGraph::Node> NodeDispatcher; +    typedef compiler::dispatcher<SemanticGraph::Edge> EdgeDispatcher;      //      // -    struct NodeBase : virtual Bits::Dispatcher<SemanticGraph::Node>, -                      virtual Bits::Dispatcher<SemanticGraph::Edge> +    struct NodeBase: NodeDispatcher, EdgeDispatcher      { -      Void -      edge_traverser (EdgeDispatcherBase& d) +      void +      edge_traverser (EdgeDispatcher& d)        { -        Bits::Dispatcher<SemanticGraph::Edge>::traverser (d); +        EdgeDispatcher::traverser (d);        } -      EdgeDispatcherBase& +      EdgeDispatcher&        edge_traverser ()        {          return *this;        } -    public: -      using Bits::Dispatcher<SemanticGraph::Node>::dispatch; -      using Bits::Dispatcher<SemanticGraph::Edge>::dispatch; - -      using Bits::Dispatcher<SemanticGraph::Node>::map; - -      using Bits::Dispatcher<SemanticGraph::Edge>::iterate_and_dispatch; -    }; - - -    // -    // -    template <typename T> -    struct Node : Bits::TraverserBase<SemanticGraph::Node>, virtual NodeBase -    { -      typedef -      T -      Type; - -      Node () -      { -        map (typeid (Type), *this); -      } - -      virtual Void -      traverse (Type&) = 0; +      using NodeDispatcher::dispatch; +      using EdgeDispatcher::dispatch; -      virtual Void -      trampoline (SemanticGraph::Node& i) -      { -        traverse (dynamic_cast<Type&> (i)); -      } - -      virtual Void -      trampoline (SemanticGraph::Node const&) -      { -        abort (); -      } +      using EdgeDispatcher::iterate_and_dispatch;      }; - -    // -    // -    struct EdgeBase : virtual Bits::Dispatcher<SemanticGraph::Edge>, -                      virtual Bits::Dispatcher<SemanticGraph::Node> +    struct EdgeBase: EdgeDispatcher, NodeDispatcher      { -      Void -      node_traverser (NodeDispatcherBase& d) +      void +      node_traverser (NodeDispatcher& d)        { -        Bits::Dispatcher<SemanticGraph::Node>::traverser (d); +        NodeDispatcher::traverser (d);        } -      NodeDispatcherBase& +      NodeDispatcher&        node_traverser ()        {          return *this;        } -    public: -      using Bits::Dispatcher<SemanticGraph::Edge>::dispatch; -      using Bits::Dispatcher<SemanticGraph::Node>::dispatch; +      using EdgeDispatcher::dispatch; +      using NodeDispatcher::dispatch; -      using Bits::Dispatcher<SemanticGraph::Edge>::map; - -      using Bits::Dispatcher<SemanticGraph::Node>::iterate_and_dispatch; -    }; - -    template <typename T> -    struct Edge : Bits::TraverserBase<SemanticGraph::Edge>, virtual EdgeBase -    { -      typedef -      T -      Type; - -      Edge () -      { -        map (typeid (Type), *this); -      } - -      virtual Void -      traverse (Type&) = 0; - -      virtual Void -      trampoline (SemanticGraph::Edge& i) -      { -        traverse (dynamic_cast<Type&> (i)); -      } - -      virtual Void -      trampoline (SemanticGraph::Edge const&) -      { -        abort (); -      } +      using NodeDispatcher::iterate_and_dispatch;      }; -    inline -    EdgeBase& +    inline EdgeBase&      operator>> (NodeBase& n, EdgeBase& e)      {        n.edge_traverser (e);        return e;      } -    inline -    NodeBase& +    inline NodeBase&      operator>> (EdgeBase& e, NodeBase& n)      {        e.node_traverser (n);        return n;      } +    // +    // +    template <typename T> +    struct Node: compiler::traverser_impl<T, SemanticGraph::Node>, +                 virtual NodeBase +    { +      typedef T Type; +    }; + +    template <typename T> +    struct Edge: compiler::traverser_impl<T, SemanticGraph::Edge>, +                 virtual EdgeBase +    { +      typedef T Type; +    }; + +    //      // Edges      // @@ -176,7 +108,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.named ()); @@ -197,18 +129,17 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.type ());        }      }; - +    //      // Nodes      // -      //      //      struct Nameable : Node<SemanticGraph::Nameable> @@ -222,20 +153,20 @@ namespace XSDFrontend      struct ScopeTemplate : Node<T>      {      public: -      virtual Void +      virtual void        traverse (T& s)        {          names (s);        }        template<typename X> -      Void +      void        names (T& s, -             EdgeDispatcherBase& d, -             Void (X::*pre_) (T&) = (Void (ScopeTemplate<T>::*)(T&)) (0), -             Void (X::*post_) (T&) = (Void (ScopeTemplate<T>::*)(T&)) (0), -             Void (X::*none_) (T&) = (Void (ScopeTemplate<T>::*)(T&)) (0), -             Void (X::*next_) (T&) = (Void (ScopeTemplate<T>::*)(T&)) (0)) +             EdgeDispatcher& d, +             void (X::*pre_) (T&) = (void (ScopeTemplate<T>::*)(T&)) (0), +             void (X::*post_) (T&) = (void (ScopeTemplate<T>::*)(T&)) (0), +             void (X::*none_) (T&) = (void (ScopeTemplate<T>::*)(T&)) (0), +             void (X::*next_) (T&) = (void (ScopeTemplate<T>::*)(T&)) (0))        {          X* this_ (dynamic_cast<X*> (this)); @@ -266,13 +197,13 @@ namespace XSDFrontend          }        } -      virtual Void -      names (T& s, EdgeDispatcherBase& d) +      virtual void +      names (T& s, EdgeDispatcher& d)        {          names<ScopeTemplate<T> > (s, d);        } -      virtual Void +      virtual void        names (T& s)        {          names (s, @@ -283,22 +214,22 @@ namespace XSDFrontend                 &ScopeTemplate<T>::names_next);        } -      virtual Void +      virtual void        names_pre (T&)        {        } -      virtual Void +      virtual void        names_next (T&)        {        } -      virtual Void +      virtual void        names_post (T&)        {        } -      virtual Void +      virtual void        names_none (T&)        {        } @@ -316,7 +247,7 @@ namespace XSDFrontend      //      struct Type : Node<SemanticGraph::Type>      { -      virtual Void +      virtual void        traverse (SemanticGraph::Type&) = 0;      }; @@ -325,19 +256,19 @@ namespace XSDFrontend      //      struct Instance : Node<SemanticGraph::Instance>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void -      belongs (Type&, EdgeDispatcherBase&); +      virtual void +      belongs (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        belongs (Type&); -      virtual Void +      virtual void        post (Type&);      }; @@ -346,19 +277,19 @@ namespace XSDFrontend      //      struct Member : Node<SemanticGraph::Member>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void -      belongs (Type&, EdgeDispatcherBase&); +      virtual void +      belongs (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        belongs (Type&); -      virtual Void +      virtual void        post (Type&);      }; @@ -376,7 +307,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.base ()); @@ -397,7 +328,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.base ()); @@ -418,7 +349,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.base ()); @@ -439,7 +370,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& a)        {          dispatch (a.type ()); @@ -452,7 +383,7 @@ namespace XSDFrontend      //      struct Contains : Edge<SemanticGraph::Contains>      { -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.element ()); diff --git a/libxsd-frontend/xsd-frontend/traversal/elements.txx b/libxsd-frontend/xsd-frontend/traversal/elements.txx index b673a8d..5b1aec0 100644 --- a/libxsd-frontend/xsd-frontend/traversal/elements.txx +++ b/libxsd-frontend/xsd-frontend/traversal/elements.txx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/elements.txx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  namespace XSDFrontend diff --git a/libxsd-frontend/xsd-frontend/traversal/enumeration.cxx b/libxsd-frontend/xsd-frontend/traversal/enumeration.cxx index a8a49a5..124606f 100644 --- a/libxsd-frontend/xsd-frontend/traversal/enumeration.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/enumeration.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/enumeration.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/enumeration.hxx> @@ -11,7 +10,7 @@ namespace XSDFrontend    {      // Enumeration      // -    Void Enumeration:: +    void Enumeration::      traverse (Type& e)      {        pre (e); @@ -21,30 +20,30 @@ namespace XSDFrontend        post (e);      } -    Void Enumeration:: +    void Enumeration::      pre (Type&)      {      } -    Void Enumeration:: +    void Enumeration::      name (Type&)      {      } -    Void Enumeration:: +    void Enumeration::      inherits (Type& e)      {        inherits (e, *this);      } -    Void Enumeration:: -    inherits (Type& e, EdgeDispatcherBase& d) +    void Enumeration:: +    inherits (Type& e, EdgeDispatcher& d)      {        if (e.inherits_p ())          d.dispatch (e.inherits ());      } -    Void Enumeration:: +    void Enumeration::      post (Type&)      {      } @@ -52,7 +51,7 @@ namespace XSDFrontend      // Enumerator      // -    Void Enumerator:: +    void Enumerator::      traverse (Type& e)      {        pre (e); @@ -61,29 +60,29 @@ namespace XSDFrontend        post (e);      } -    Void Enumerator:: +    void Enumerator::      pre (Type&)      {      } -    Void Enumerator:: -    belongs (Type& e, EdgeDispatcherBase& d) +    void Enumerator:: +    belongs (Type& e, EdgeDispatcher& d)      {        d.dispatch (e.belongs ());      } -    Void Enumerator:: +    void Enumerator::      belongs (Type& e)      {        belongs (e, edge_traverser ());      } -    Void Enumerator:: +    void Enumerator::      name (Type&)      {      } -    Void Enumerator:: +    void Enumerator::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/enumeration.hxx b/libxsd-frontend/xsd-frontend/traversal/enumeration.hxx index c6d7f04..960b11c 100644 --- a/libxsd-frontend/xsd-frontend/traversal/enumeration.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/enumeration.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/enumeration.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_ENUMERATION_HXX @@ -15,43 +14,43 @@ namespace XSDFrontend    {      struct Enumeration : ScopeTemplate<SemanticGraph::Enumeration>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        name (Type&); -      virtual Void +      virtual void        inherits (Type&); -      Void -      inherits (Type&, EdgeDispatcherBase&); +      void +      inherits (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        post (Type&);      };      struct Enumerator : Node<SemanticGraph::Enumerator>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void -      belongs (Type&, EdgeDispatcherBase&); +      virtual void +      belongs (Type&, EdgeDispatcher&); -      virtual Void +      virtual void        belongs (Type&); -      virtual Void +      virtual void        name (Type&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/fundamental.cxx b/libxsd-frontend/xsd-frontend/traversal/fundamental.cxx index b9cadec..5202adf 100644 --- a/libxsd-frontend/xsd-frontend/traversal/fundamental.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/fundamental.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/fundamental.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/fundamental.hxx> diff --git a/libxsd-frontend/xsd-frontend/traversal/fundamental.hxx b/libxsd-frontend/xsd-frontend/traversal/fundamental.hxx index 5c20d9c..0b771cd 100644 --- a/libxsd-frontend/xsd-frontend/traversal/fundamental.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/fundamental.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/fundamental.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_FUNDAMENTAL_HXX diff --git a/libxsd-frontend/xsd-frontend/traversal/list.cxx b/libxsd-frontend/xsd-frontend/traversal/list.cxx index ec434ba..9241af1 100644 --- a/libxsd-frontend/xsd-frontend/traversal/list.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/list.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/list.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/list.hxx> @@ -9,7 +8,7 @@ namespace XSDFrontend  {    namespace Traversal    { -    Void List:: +    void List::      traverse (Type& l)      {        pre (l); @@ -18,29 +17,29 @@ namespace XSDFrontend        post (l);      } -    Void List:: +    void List::      pre (Type&)      {      } -    Void List:: +    void List::      argumented (Type& l)      {        argumented (l, *this);      } -    Void List:: -    argumented (Type& l, EdgeDispatcherBase& d) +    void List:: +    argumented (Type& l, EdgeDispatcher& d)      {        d.dispatch (l.argumented ());      } -    Void List:: +    void List::      name (Type&)      {      } -    Void List:: +    void List::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/list.hxx b/libxsd-frontend/xsd-frontend/traversal/list.hxx index 2bbc136..06aa154 100644 --- a/libxsd-frontend/xsd-frontend/traversal/list.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/list.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/list.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_LIST_HXX @@ -15,22 +14,22 @@ namespace XSDFrontend    {      struct List: Node<SemanticGraph::List>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        argumented (Type&); -      virtual Void -      argumented (Type&, EdgeDispatcherBase& d); +      virtual void +      argumented (Type&, EdgeDispatcher& d); -      virtual Void +      virtual void        name (Type&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/namespace.cxx b/libxsd-frontend/xsd-frontend/traversal/namespace.cxx index cbc6ef2..fbf1105 100644 --- a/libxsd-frontend/xsd-frontend/traversal/namespace.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/namespace.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/namespace.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/namespace.hxx> diff --git a/libxsd-frontend/xsd-frontend/traversal/namespace.hxx b/libxsd-frontend/xsd-frontend/traversal/namespace.hxx index 22305e1..0dd0901 100644 --- a/libxsd-frontend/xsd-frontend/traversal/namespace.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/namespace.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/namespace.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_NAMESPACE_HXX @@ -15,7 +14,7 @@ namespace XSDFrontend    {      struct Namespace: ScopeTemplate<SemanticGraph::Namespace>      { -      virtual Void +      virtual void        traverse (Type& m)        {          pre (m); @@ -24,17 +23,17 @@ namespace XSDFrontend          post (m);        } -      virtual Void +      virtual void        pre (Type&)        {        } -      virtual Void +      virtual void        name (Type&)        {        } -      virtual Void +      virtual void        post (Type&)        {        } diff --git a/libxsd-frontend/xsd-frontend/traversal/particle.cxx b/libxsd-frontend/xsd-frontend/traversal/particle.cxx index e3d3a97..1dd0ce0 100644 --- a/libxsd-frontend/xsd-frontend/traversal/particle.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/particle.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/particle.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/particle.hxx> @@ -11,19 +10,19 @@ namespace XSDFrontend    {      // Particle      // -    Void Particle:: +    void Particle::      traverse (Type& c)      {        pre (c);        post (c);      } -    Void Particle:: +    void Particle::      pre (Type&)      {      } -    Void Particle:: +    void Particle::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/particle.hxx b/libxsd-frontend/xsd-frontend/traversal/particle.hxx index 3584c12..5346ae9 100644 --- a/libxsd-frontend/xsd-frontend/traversal/particle.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/particle.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/particle.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2006-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_PARTICLE_HXX @@ -15,13 +14,13 @@ namespace XSDFrontend    {      struct Particle : Node<SemanticGraph::Particle>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/traversal/schema.cxx b/libxsd-frontend/xsd-frontend/traversal/schema.cxx index acfca26..090e964 100644 --- a/libxsd-frontend/xsd-frontend/traversal/schema.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/schema.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/schema.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/schema.hxx> diff --git a/libxsd-frontend/xsd-frontend/traversal/schema.hxx b/libxsd-frontend/xsd-frontend/traversal/schema.hxx index a975475..a38ddfd 100644 --- a/libxsd-frontend/xsd-frontend/traversal/schema.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/schema.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/schema.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_SCHEMA_HXX @@ -26,7 +25,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.schema ()); @@ -46,7 +45,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.schema ()); @@ -67,7 +66,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.schema ()); @@ -88,7 +87,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.schema ()); @@ -109,7 +108,7 @@ namespace XSDFrontend          node_traverser (n);        } -      virtual Void +      virtual void        traverse (Type& e)        {          dispatch (e.schema ()); @@ -121,7 +120,7 @@ namespace XSDFrontend      //      struct Schema: ScopeTemplate<SemanticGraph::Schema>      { -      virtual Void +      virtual void        traverse (Type& s)        {          pre (s); @@ -134,12 +133,12 @@ namespace XSDFrontend          post (s);        } -      virtual Void +      virtual void        pre (Type&)        {        } -      virtual Void +      virtual void        post (Type&)        {        } diff --git a/libxsd-frontend/xsd-frontend/traversal/union.cxx b/libxsd-frontend/xsd-frontend/traversal/union.cxx index acf419a..fe8f7d0 100644 --- a/libxsd-frontend/xsd-frontend/traversal/union.cxx +++ b/libxsd-frontend/xsd-frontend/traversal/union.cxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/union.cxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #include <xsd-frontend/traversal/union.hxx> @@ -9,7 +8,7 @@ namespace XSDFrontend  {    namespace Traversal    { -    Void Union:: +    void Union::      traverse (Type& u)      {        pre (u); @@ -18,29 +17,29 @@ namespace XSDFrontend        post (u);      } -    Void Union:: +    void Union::      pre (Type&)      {      } -    Void Union:: +    void Union::      argumented (Type& u)      {        argumented (u, *this);      } -    Void Union:: -    argumented (Type& u, EdgeDispatcherBase& d) +    void Union:: +    argumented (Type& u, EdgeDispatcher& d)      {        iterate_and_dispatch (u.argumented_begin (), u.argumented_end (), d);      } -    Void Union:: +    void Union::      name (Type&)      {      } -    Void Union:: +    void Union::      post (Type&)      {      } diff --git a/libxsd-frontend/xsd-frontend/traversal/union.hxx b/libxsd-frontend/xsd-frontend/traversal/union.hxx index e3d31bd..8012036 100644 --- a/libxsd-frontend/xsd-frontend/traversal/union.hxx +++ b/libxsd-frontend/xsd-frontend/traversal/union.hxx @@ -1,6 +1,5 @@  // file      : xsd-frontend/traversal/union.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TRAVERSAL_UNION_HXX @@ -15,22 +14,22 @@ namespace XSDFrontend    {      struct Union: Node<SemanticGraph::Union>      { -      virtual Void +      virtual void        traverse (Type&); -      virtual Void +      virtual void        pre (Type&); -      virtual Void +      virtual void        argumented (Type&); -      virtual Void -      argumented (Type&, EdgeDispatcherBase& d); +      virtual void +      argumented (Type&, EdgeDispatcher& d); -      virtual Void +      virtual void        name (Type&); -      virtual Void +      virtual void        post (Type&);      };    } diff --git a/libxsd-frontend/xsd-frontend/types.cxx b/libxsd-frontend/xsd-frontend/types.cxx new file mode 100644 index 0000000..49faf92 --- /dev/null +++ b/libxsd-frontend/xsd-frontend/types.cxx @@ -0,0 +1,61 @@ +// file      : xsd-frontend/types.cxx +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#include <cstdlib> // std::mbstowcs + +#include <xsd-frontend/types.hxx> + +namespace XSDFrontend +{ +  // NonRepresentable +  // +  char const* NonRepresentable:: +  what () const throw () +  { +    return "character is not representable in the narrower encoding"; +  } + +  // StringTemplate +  // + +  // Specialization for char to wchar_t conversion. +  // +  template <> +  void StringTemplate<wchar_t, char>:: +  from_narrow (char const* s) +  { +    size_type size (std::mbstowcs (0, s, 0) + 1); + +    // I dare to change the guts! +    // +    resize (size - 1); + +    wchar_t* p (const_cast<wchar_t*> (data ())); + +    std::mbstowcs (p, s, size); +  } + +  // Specialization for wchar_t to char conversion. +  // +  template <> +  StringTemplate<char> StringTemplate<wchar_t, char>:: +  to_narrow () const +  { +    size_type size (std::wcstombs (0, c_str (), 0)); + +    if (size == size_type (-1)) +      throw NonRepresentable (); + +    // I dare to change the guts! +    // +    StringTemplate<char> r; +    r.resize (size); + +    char* p (const_cast<char*> (r.data ())); + +    std::wcstombs (p, c_str (), size + 1); + +    return r; +  } +} diff --git a/libxsd-frontend/xsd-frontend/types.hxx b/libxsd-frontend/xsd-frontend/types.hxx index b3059fd..0cd1ad1 100644 --- a/libxsd-frontend/xsd-frontend/types.hxx +++ b/libxsd-frontend/xsd-frontend/types.hxx @@ -1,18 +1,250 @@  // file      : xsd-frontend/types.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_TYPES_HXX  #define XSD_FRONTEND_TYPES_HXX -#include <cult/types.hxx> +#include <string> +#include <cstddef> // std::size_t  namespace XSDFrontend  { -  using namespace Cult::Types; +  using std::size_t; -  typedef Cult::WideString String; +  namespace Bits +  { +    struct None {}; + +    template <typename C> +    struct NarrowerChar +    { +      typedef None Type; +    }; + +    template <> +    struct NarrowerChar<wchar_t> +    { +      typedef char Type; +    }; +  } + +  struct NonRepresentable: std::exception +  { +    virtual char const* +    what () const throw (); +  }; + +  template <typename C, typename NC = typename Bits::NarrowerChar<C>::Type> +  class StringTemplate; + +  template <> +  class StringTemplate<Bits::None, Bits::None> +  { +  }; + +  template <typename C, typename NC> +  class StringTemplate : public std::basic_string<C> +  { +    typedef std::basic_string<C> Base; +    typedef std::basic_string<NC> NarrowerBase; + +    Base& +    base () +    { +      return *this; +    } + +    Base const& +    base () const +    { +      return *this; +    } + +  public: +    typedef typename Base::size_type size_type; + +    using Base::npos; + +  public: +    StringTemplate () +    { +    } + +    StringTemplate (StringTemplate const& str, +                    size_type pos, +                    size_type n = npos) +        : Base (str, pos, n) +    { +    } + +    StringTemplate (C const* s, size_type n) +        : Base (s, n) +    { +    } + +    StringTemplate (C const* s) +        : Base (s) +    { +    } + +    StringTemplate (size_type n, C c) +        : Base (n, c) +    { +    } + +    template <typename I> +    StringTemplate(I begin, I end) +        : Base (begin, end) +    { +    } + +    StringTemplate (StringTemplate const& other) +        : Base (other) +    { +    } + +    // Conversion from Base. +    // +    StringTemplate (Base const& str) +        : Base (str) +    { +    } + +    // Conversion from the Narrower type. Experimental. +    // +    StringTemplate (NC const* s) +    { +      from_narrow (s); +    } + +    StringTemplate (StringTemplate<NC> const& other) +    { +      from_narrow (other.c_str ()); +    } + +    StringTemplate (NarrowerBase const& other) +    { +      from_narrow (other.c_str ()); +    } + +    // Assignment. +    // +    StringTemplate& +    operator= (StringTemplate const& str) +    { +      base () = str; +      return *this; +    } + +    StringTemplate& +    operator= (C const* s) +    { +      base () = s; +      return *this; +    } + +    StringTemplate& +    operator= (C c) +    { +      base () = c; +      return *this; +    } + +    // Assignment from Base. +    // +    StringTemplate& +    operator= (Base const& str) +    { +      base () = str; +      return *this; +    } + +  public: +    StringTemplate& +    operator+= (StringTemplate const& str) +    { +      base () += str; +      return *this; +    } + +    StringTemplate& +    operator+= (C const* s) +    { +      base () += s; +      return *this; +    } + +    StringTemplate& +    operator+= (C c) +    { +      base () += c; +      return *this; +    } + +    // Conversion to the Narrower type. +    // +  public: +    StringTemplate<NC> +    to_narrow () const; + +    // Conversion to bool. +    // +  private: +    typedef void (StringTemplate::*BooleanConvertible)(); +    void true_ () {} + +  public: +    operator BooleanConvertible () const +    { +      return this->empty () ? 0 : &StringTemplate::true_; +    } + +  private: +    void +    from_narrow (NC const* s); +  }; + + +  template<typename C> +  StringTemplate<C> +  operator+ (StringTemplate<C> const& lhs, StringTemplate<C> const& rhs) +  { +    return StringTemplate<C> (lhs) += rhs; +  } + +  template<typename C> +  StringTemplate<C> +  operator+ (C const* lhs, StringTemplate<C> const& rhs) +  { +    return StringTemplate<C> (lhs) += rhs; +  } + +  template<typename C> +  StringTemplate<C> +  operator+ (StringTemplate<C> const& lhs, C const* rhs) +  { +    return StringTemplate<C> (lhs) += rhs; +  } + +  template<typename C> +  StringTemplate<C> +  operator+ (C lhs, StringTemplate<C> const& rhs) +  { +    return StringTemplate<C> (1, lhs) += rhs; +  } + +  template<typename C> +  StringTemplate<C> +  operator+ (StringTemplate<C> const& lhs, C rhs) +  { +    return StringTemplate<C> (lhs) += rhs; +  } + +  typedef StringTemplate<char> NarrowString; +  typedef StringTemplate<wchar_t> WideString; + +  typedef WideString String;  }  #endif  // XSD_FRONTEND_TYPES_HXX diff --git a/libxsd-frontend/xsd-frontend/version.hxx b/libxsd-frontend/xsd-frontend/version.hxx new file mode 100644 index 0000000..fa6d1de --- /dev/null +++ b/libxsd-frontend/xsd-frontend/version.hxx @@ -0,0 +1,14 @@ +// file      : xsd-frontend/version.hxx +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSD_FRONTEND_VERSION_HXX +#define XSD_FRONTEND_VERSION_HXX + +#include <xercesc/util/XercesVersion.hpp> + +#if _XERCES_VERSION < 30000 +#  error Xerces-C++ 2-series is not supported +#endif + +#endif  // XSD_FRONTEND_VERSION_HXX diff --git a/libxsd-frontend/xsd-frontend/xml.hxx b/libxsd-frontend/xsd-frontend/xml.hxx index 8c9b01c..d33f6bf 100644 --- a/libxsd-frontend/xsd-frontend/xml.hxx +++ b/libxsd-frontend/xsd-frontend/xml.hxx @@ -1,18 +1,17 @@  // file      : xsd-frontend/xml.hxx -// author    : Boris Kolpackov <boris@codesynthesis.com> -// copyright : Copyright (c) 2005-2010 Code Synthesis Tools CC +// copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC  // license   : GNU GPL v2 + exceptions; see accompanying LICENSE file  #ifndef XSD_FRONTEND_XML_HXX  #define XSD_FRONTEND_XML_HXX +#include <vector>  #include <ostream>  #include <xercesc/dom/DOM.hpp>  #include <xercesc/util/XMLString.hpp> -#include <cult/containers/vector.hxx> - +#include <xsd-frontend/version.hxx>            // Check Xerces-C++ version.  #include <xsd-frontend/types.hxx>  #include <xsd-frontend/schema-dom-parser.hxx> @@ -24,9 +23,9 @@ namespace XSDFrontend      inline      String -    transcode (XMLCh const* s, Size length) +    transcode (XMLCh const* s, size_t length)      { -      if (sizeof (WideChar) == 4) +      if (sizeof (wchar_t) == 4)        {          // UTF-32          // @@ -34,8 +33,8 @@ namespace XSDFrontend          // Find what the resulting buffer size will be.          // -        Size rl (0); -        Boolean valid (true); +        size_t rl (0); +        bool valid (true);          for (XMLCh const* p (s); p < end; ++p)          { @@ -60,27 +59,27 @@ namespace XSDFrontend          String r;          r.reserve (rl + 1);          r.resize (rl); -        WideChar* rs (const_cast<WideChar*> (r.c_str ())); +        wchar_t* rs (const_cast<wchar_t*> (r.c_str ())); -        Size i (0); +        size_t i (0);          for (XMLCh const* p (s); p < end; ++p)          {            XMLCh x (*p);            if (x < 0xD800 || x > 0xDBFF) -            rs[i++] = WideChar (x); +            rs[i++] = wchar_t (x);            else              rs[i++] = ((x - 0xD800) << 10) + (*++p - 0xDC00) + 0x10000;          }          return r;        } -      else if (sizeof (WideChar) == 2) +      else if (sizeof (wchar_t) == 2)        {          // UTF-16          // -        return String (reinterpret_cast<const WideChar*> (s), length); +        return String (reinterpret_cast<const wchar_t*> (s), length);        }        else          return String (); @@ -97,7 +96,7 @@ namespace XSDFrontend      NarrowString      transcode_to_narrow (XMLCh const* xs)      { -      Char* s (Xerces::XMLString::transcode (xs)); +      char* s (Xerces::XMLString::transcode (xs));        NarrowString r (s);        Xerces::XMLString::release (&s);        return r; @@ -107,16 +106,16 @@ namespace XSDFrontend      XMLCh*      transcode (String const& str)      { -      Size l (str.size ()); -      WideChar const* s (str.c_str ()); +      size_t l (str.size ()); +      wchar_t const* s (str.c_str ()); -      if (sizeof (WideChar) == 4) +      if (sizeof (wchar_t) == 4)        {          // Find what the resulting buffer size will be.          // -        Size rl (0); +        size_t rl (0); -        for (WideChar const* p (s); p < s + l; ++p) +        for (wchar_t const* p (s); p < s + l; ++p)          {            rl += (*p & 0xFFFF0000) ? 2 : 1;          } @@ -124,9 +123,9 @@ namespace XSDFrontend          XMLCh* r (new XMLCh[rl + 1]);          XMLCh* ir (r); -        for (WideChar const* p (s); p < s + l; ++p) +        for (wchar_t const* p (s); p < s + l; ++p)          { -          WideChar w (*p); +          wchar_t w (*p);            if (w & 0xFFFF0000)            { @@ -143,12 +142,12 @@ namespace XSDFrontend          return r;        } -      else if (sizeof (WideChar) == 2) +      else if (sizeof (wchar_t) == 2)        {          XMLCh* r (new XMLCh[l + 1]);          XMLCh* ir (r); -        for (Size i (0); i < l; ++ir, ++i) +        for (size_t i (0); i < l; ++ir, ++i)            *ir = static_cast<XMLCh> (s[i]);          *ir = XMLCh (0); @@ -167,7 +166,7 @@ namespace XSDFrontend        {        } -      XMLChString (WideChar const* s) +      XMLChString (wchar_t const* s)            : s_ (transcode (String (s)))        {        } @@ -217,20 +216,20 @@ namespace XSDFrontend        }      public: -      UnsignedLong +      unsigned long        line () const        {          //@@ cache          // -        return reinterpret_cast<UnsignedLong> (e_->getUserData (line_key)); +        return reinterpret_cast<unsigned long> (e_->getUserData (line_key));        } -      UnsignedLong +      unsigned long        column () const        {          //@@ cache          // -        return reinterpret_cast<UnsignedLong> (e_->getUserData (column_key)); +        return reinterpret_cast<unsigned long> (e_->getUserData (column_key));        }      public: @@ -243,7 +242,7 @@ namespace XSDFrontend      public:        // Attribute identified by a name.        // -      Boolean +      bool        attribute_p (String const& name) const        {          return attribute_p ("", name); @@ -264,7 +263,7 @@ namespace XSDFrontend        // Attribute identified by namespace and name.        // -      Boolean +      bool        attribute_p (String const& namespace_, String const& name) const        {          Xerces::DOMAttr* a ( @@ -303,7 +302,7 @@ namespace XSDFrontend      inline String      prefix (String const& n)      { -      Size i (0); +      size_t i (0);        while (i < n.length () && n[i] != L':') ++i;        //std::wcerr << "prefix " << n << " " @@ -315,7 +314,7 @@ namespace XSDFrontend      inline String      uq_name (String const& n)      { -      Size i (0); +      size_t i (0);        while (i < n.length () && n[i] != L':') ++i;        return String (n.c_str () + (i == n.length () ? 0 : i + 1)); @@ -367,18 +366,11 @@ namespace XSDFrontend      ns_prefix (Element const& e, String const& wns)      {        XMLChString ns (wns); - -#if _XERCES_VERSION >= 30000 -      XMLCh const* p ( -        e.dom_element ()->lookupPrefix (ns.c_str ())); -#else -      XMLCh const* p ( -        e.dom_element ()->lookupNamespacePrefix (ns.c_str (), false)); -#endif +      XMLCh const* p (e.dom_element ()->lookupPrefix (ns.c_str ()));        if (p == 0)        { -        Boolean r (e.dom_element ()->isDefaultNamespace (ns.c_str ())); +        bool r (e.dom_element ()->isDefaultNamespace (ns.c_str ()));          if (r)            return L""; @@ -518,9 +510,9 @@ namespace XSDFrontend        // Conversion to bool.        // -      typedef X* (AutoPtr::*BooleanConvertible)() const; +      typedef X* (AutoPtr::*boolConvertible)() const; -      operator BooleanConvertible () const throw () +      operator boolConvertible () const throw ()        {          return x_ ? &AutoPtr<X>::operator-> : 0;        } @@ -530,13 +522,13 @@ namespace XSDFrontend      };      template <typename X> -    struct PtrVector: Cult::Containers::Vector<X*> +    struct PtrVector: std::vector<X*>      { -      typedef Cult::Containers::Vector<X*> Base; +      typedef std::vector<X*> Base;        ~PtrVector ()        { -        for (typename Base::Iterator i (this->begin ()), e (this->end ()); +        for (typename Base::iterator i (this->begin ()), e (this->end ());               i != e; ++i)          {            if (*i) @@ -544,7 +536,7 @@ namespace XSDFrontend          }        } -      Void +      void        push_back (AutoPtr<X>& x)        {          Base::push_back (0); | 
