diff options
| author | Jörg Frings-Fürst <debian@jff.email> | 2024-03-06 10:24:46 +0100 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff.email> | 2024-03-06 10:24:46 +0100 | 
| commit | 372a0e99c2f61543d9e14d9933b59d9d1f4cb26e (patch) | |
| tree | bbadf39aed0610c8f8f7b41fefff47773b8ac205 /xsd/elements.hxx | |
| parent | 23d41842168ac1a1580111b9c5c73500ceee3d57 (diff) | |
| parent | 4538829ab86b5a1cd4e845e7eab165029c9d6d46 (diff) | |
Merge branch 'feature/upstream' into develop
Diffstat (limited to 'xsd/elements.hxx')
| -rw-r--r-- | xsd/elements.hxx | 125 | 
1 files changed, 125 insertions, 0 deletions
| diff --git a/xsd/elements.hxx b/xsd/elements.hxx new file mode 100644 index 0000000..d3dd659 --- /dev/null +++ b/xsd/elements.hxx @@ -0,0 +1,125 @@ +// file      : xsd/elements.hxx +// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef XSD_ELEMENTS_HXX +#define XSD_ELEMENTS_HXX + +#include <libxsd-frontend/semantic-graph.hxx> +#include <libxsd-frontend/traversal.hxx> + +#include <xsd/types.hxx> + +namespace SemanticGraph = XSDFrontend::SemanticGraph; +namespace Traversal = XSDFrontend::Traversal; + +// Anonymous feedback via belongs edge. +// +struct AnonymousBase : Traversal::Element, Traversal::Attribute +{ +  AnonymousBase (Traversal::NodeDispatcher& d1) +      : complex_ (&d1, 0) +  { +    edge_traverser (belongs_); +    belongs_.node_traverser (complex_); +  } + +  AnonymousBase (Traversal::NodeDispatcher& d1, Traversal::NodeDispatcher& d2) +      : complex_ (&d1, &d2) +  { +    edge_traverser (belongs_); +    belongs_.node_traverser (complex_); +  } + +  // Hooks. +  // +public: +  virtual void +  member_pre (SemanticGraph::Member&) +  { +  } + +  virtual void +  member_post (SemanticGraph::Member&) +  { +  } + +  /* +    virtual void +    type_pre (SemanticGraph::Type& t) +    { +    } + +    virtual void +    type_post (SemanticGraph::Type& t) +    { +    } +  */ + +public: + +  virtual void +  traverse (SemanticGraph::Element& e) +  { +    SemanticGraph::Type& t (e.type ()); + +    if (!t.named_p () && !t.context ().count ("seen")) +    { +      t.context ().set ("seen", true); + +      member_pre (e); + +      Element::belongs (e, belongs_); + +      member_post (e); + +      t.context ().remove ("seen"); +    } +  } + +  virtual void +  traverse (SemanticGraph::Attribute& a) +  { +    SemanticGraph::Type& t (a.type ()); + +    if (!t.named_p () && !t.context ().count ("seen")) +    { +      t.context ().set ("seen", true); + +      member_pre (a); + +      Attribute::belongs (a, belongs_); + +      member_post (a); + +      t.context ().remove ("seen"); +    } +  } + +private: +  struct Complex : Traversal::Complex +  { +    Complex (Traversal::NodeDispatcher* d1, Traversal::NodeDispatcher* d2) +        : d1_ (d1), d2_ (d2) +    { +    } + +    virtual void +    traverse (SemanticGraph::Complex& c) +    { +      if (d1_) +        d1_->dispatch (c); + +      if (d2_) +        d2_->dispatch (c); +    } + +  private: +    Traversal::NodeDispatcher* d1_; +    Traversal::NodeDispatcher* d2_; + +  } complex_; + +  Traversal::Belongs belongs_; +}; + +#endif // XSD_ELEMENTS_HXX | 
