2121#pragma  once
2222
2323#include  < cxx/names_fwd.h> 
24+ #include  < cxx/symbol_chain_view.h> 
25+ #include  < cxx/symbols.h> 
2426#include  < cxx/symbols_fwd.h> 
2527#include  < cxx/types_fwd.h> 
2628
27- #include  < ranges> 
2829#include  < vector> 
2930
3031namespace  cxx  {
3132
33+ class  SymbolChainView ;
34+ 
3235class  Scope  {
3336 public: 
34-   class  MemberIterator  {
35-    public: 
36-     using  value_type = Symbol*;
37-     using  difference_type = std::ptrdiff_t ;
38- 
39-     MemberIterator () = default ;
40-     explicit  MemberIterator (Symbol* symbol) : symbol_(symbol) {}
41- 
42-     auto  operator <=>(const  MemberIterator&) const  = default ;
43- 
44-     auto  operator *() const  -> Symbol* { return  symbol_; }
45-     auto  operator ++() -> MemberIterator&;
46-     auto  operator ++(int ) -> MemberIterator;
47- 
48-    private: 
49-     Symbol* symbol_ = nullptr ;
50-   };
51- 
5237  explicit  Scope (Scope* parent);
5338  ~Scope ();
5439
5540  [[nodiscard]] auto  isEnumScope () const  -> bool;
5641  [[nodiscard]] auto  isTemplateParametersScope () const  -> bool;
57- 
58-   [[nodiscard]] auto  parent () const  -> Scope* { return  parent_; }
59-   void  setParent (Scope* parent) { parent_ = parent; }
60- 
6142  [[nodiscard]] auto  enclosingNonTemplateParametersScope () const  -> Scope*;
6243
44+   [[nodiscard]] auto  parent () const  -> Scope* { return  parent_; }
6345  [[nodiscard]] auto  owner () const  -> ScopedSymbol* { return  owner_; }
64-   void  setOwner (ScopedSymbol* owner) { owner_ = owner; }
6546
66-   [[nodiscard]] auto  symbols () const  -> const  std::vector<Symbol*>& {
67-     return  symbols_;
68-   }
47+   [[nodiscard]] auto  symbols () const  { return  std::views::all (symbols_); }
6948
70-   [[nodiscard]] auto  get (const  Name* name) const  {
71-     auto  [first, last] = getHelper (name);
72-     return  std::ranges::subrange (first, last);
49+   [[nodiscard]] auto  usingDirectives () const  {
50+     return  std::views::all (usingDirectives_);
7351  }
7452
75-   void  addSymbol (Symbol* symbol);
76-   void  replaceSymbol (Symbol* symbol, Symbol* newSymbol);
53+   [[nodiscard]] auto  find (const  Name* name) const  -> SymbolChainView;
7754
78-   [[nodiscard]] auto  usingDirectives () const  -> const  std::vector<Scope*>&;
55+   void  setParent (Scope* parent) { parent_ = parent; }
56+   void  setOwner (ScopedSymbol* owner) { owner_ = owner; }
7957
58+   void  addSymbol (Symbol* symbol);
8059  void  addUsingDirective (Scope* scope);
8160
82-  private: 
83-   [[nodiscard]] auto  getHelper (const  Name* name) const 
84-       -> std::pair<MemberIterator, MemberIterator>;
61+   void  replaceSymbol (Symbol* symbol, Symbol* newSymbol);
8562
63+  private: 
8664  void  rehash ();
8765
8866 private: 
@@ -93,4 +71,41 @@ class Scope {
9371  std::vector<Scope*> usingDirectives_;
9472};
9573
74+ namespace  views  {
75+ 
76+ constexpr  auto  class_or_namespaces =
77+     std::views::filter (&Symbol::isClassOrNamespace) |
78+     std::views::transform (
79+         [](Symbol* s) { return  static_cast <ScopedSymbol*>(s); });
80+ 
81+ constexpr  auto  enum_or_scoped_enums =
82+     std::views::filter (&Symbol::isEnumOrScopedEnum) |
83+     std::views::transform (
84+         [](Symbol* s) { return  static_cast <ScopedSymbol*>(s); });
85+ 
86+ constexpr  const  auto  namespaces =
87+     std::views::filter (&Symbol::isNamespace) |
88+     std::views::transform (symbol_cast<NamespaceSymbol>);
89+ 
90+ constexpr  auto  concepts = std::views::filter(&Symbol::isConcept) |
91+                           std::views::transform (symbol_cast<ConceptSymbol>);
92+ 
93+ constexpr  auto  classes = std::views::filter(&Symbol::isClass) |
94+                          std::views::transform (symbol_cast<ClassSymbol>);
95+ 
96+ constexpr  auto  enums = std::views::filter(&Symbol::isEnum) |
97+                        std::views::transform (symbol_cast<EnumSymbol>);
98+ 
99+ constexpr  auto  scoped_enums =
100+     std::views::filter (&Symbol::isScopedEnum) |
101+     std::views::transform(symbol_cast<ScopedEnumSymbol>);
102+ 
103+ constexpr  auto  functions = std::views::filter(&Symbol::isFunction) |
104+                            std::views::transform (symbol_cast<FunctionSymbol>);
105+ 
106+ constexpr  auto  variables = std::views::filter(&Symbol::isVariable) |
107+                            std::views::transform (symbol_cast<VariableSymbol>);
108+ 
109+ }  //  namespace views
110+ 
96111}  //  namespace cxx
0 commit comments