1 /******************************************************************************
2  *
3  *
4  *
5  * Copyright (C) 1997-2015 by Dimitri van Heesch.
6  *
7  * Permission to use, copy, modify, and distribute this software and its
8  * documentation under the terms of the GNU General Public License is hereby
9  * granted. No representations are made about the suitability of this software
10  * for any purpose. It is provided "as is" without express or implied warranty.
11  * See the GNU General Public License for more details.
12  *
13  * Documents produced by Doxygen are derivative works derived from the
14  * input used in their production; they are not affected by this license.
15  *
16  */
17 
18 #ifndef MEMBERNAME_H
19 #define MEMBERNAME_H
20 
21 #include "memberdef.h"
22 #include "linkedmap.h"
23 
24 class MemberName
25 {
26   public:
27     using Ptr = std::unique_ptr<MemberDef>;
28     using Vec = std::vector<Ptr>;
29     using iterator = typename Vec::iterator;
30     using const_iterator = typename Vec::const_iterator;
31     using reverse_iterator = typename Vec::reverse_iterator;
32     using const_reverse_iterator = typename Vec::const_reverse_iterator;
33 
MemberName(const QCString & name)34     MemberName(const QCString &name) : m_name(name) {}
memberName()35     QCString memberName() const { return m_name; }
36 
begin()37     iterator begin()                       { return m_members.begin();   }
end()38     iterator end()                         { return m_members.end();     }
begin()39     const_iterator begin() const           { return m_members.begin();   }
end()40     const_iterator end() const             { return m_members.end();     }
cbegin()41     const_iterator cbegin() const          { return m_members.cbegin();  }
cend()42     const_iterator cend() const            { return m_members.cend();    }
rbegin()43     reverse_iterator rbegin()              { return m_members.rbegin();  }
rend()44     reverse_iterator rend()                { return m_members.rend();    }
crbegin()45     const_reverse_iterator crbegin() const { return m_members.crbegin(); }
crend()46     const_reverse_iterator crend() const   { return m_members.crend();   }
empty()47     bool empty() const                     { return m_members.empty();   }
size()48     size_t size() const                    { return m_members.size();    }
back()49     Ptr &back()                            { return m_members.back();    }
back()50     const Ptr &back() const                { return m_members.back();    }
front()51     Ptr &front()                           { return m_members.front();   }
front()52     const Ptr &front() const               { return m_members.front();   }
push_back(Ptr && p)53     void push_back(Ptr &&p)                { m_members.push_back(std::move(p)); }
54 
55   private:
56     QCString m_name;
57     Vec m_members;
58 };
59 
60 /** Ordered dictionary of MemberName objects. */
61 class MemberNameLinkedMap : public LinkedMap<MemberName>
62 {
63 };
64 
65 /** Data associated with a MemberDef in an inheritance relation. */
66 class MemberInfo
67 {
68   public:
MemberInfo(const MemberDef * md,Protection p,Specifier v,bool inh)69     MemberInfo(const MemberDef *md,Protection p,Specifier v,bool inh) :
70           m_memberDef(md), m_prot(p), m_virt(v), m_inherited(inh) {}
~MemberInfo()71    ~MemberInfo() {}
72 
73     // getters
memberDef()74     const MemberDef *memberDef()                { return m_memberDef; }
memberDef()75     const MemberDef *memberDef() const          { return m_memberDef; }
prot()76     Protection prot() const                     { return m_prot;      }
virt()77     Specifier  virt() const                     { return m_virt;      }
inherited()78     bool       inherited() const                { return m_inherited; }
scopePath()79     QCString   scopePath() const                { return m_scopePath; }
ambiguityResolutionScope()80     QCString   ambiguityResolutionScope() const { return m_ambiguityResolutionScope; }
ambigClass()81     const ClassDef  *ambigClass() const         { return m_ambigClass; }
82 
83     // setters
setAmbiguityResolutionScope(const QCString & s)84     void setAmbiguityResolutionScope(const QCString &s) { m_ambiguityResolutionScope = s; }
setScopePath(const QCString & s)85     void setScopePath(const QCString &s)                { m_scopePath = s; }
setAmbigClass(const ClassDef * cd)86     void setAmbigClass(const ClassDef *cd)              { m_ambigClass = cd; }
87 
88   private:
89     const MemberDef *m_memberDef;
90     Protection     m_prot;
91     Specifier      m_virt;
92     bool           m_inherited;
93     QCString       m_scopePath;
94     QCString       m_ambiguityResolutionScope;
95     const ClassDef *m_ambigClass = 0;
96 };
97 
98 class MemberNameInfo
99 {
100   public:
101     using Ptr = std::unique_ptr<MemberInfo>;
102     using Vec = std::vector<Ptr>;
103     using iterator = typename Vec::iterator;
104     using const_iterator = typename Vec::const_iterator;
105 
MemberNameInfo(const QCString & name)106     MemberNameInfo(const QCString &name) : m_name(name) {}
memberName()107     QCString memberName() const { return m_name; }
108 
begin()109     iterator begin()                       { return m_members.begin();   }
end()110     iterator end()                         { return m_members.end();     }
begin()111     const_iterator begin() const           { return m_members.begin();   }
end()112     const_iterator end() const             { return m_members.end();     }
empty()113     bool empty() const                     { return m_members.empty();   }
size()114     size_t size() const                    { return m_members.size();    }
back()115     Ptr &back()                            { return m_members.back();    }
back()116     const Ptr &back() const                { return m_members.back();    }
front()117     Ptr &front()                           { return m_members.front();   }
front()118     const Ptr &front() const               { return m_members.front();   }
push_back(Ptr && p)119     void push_back(Ptr &&p)                { m_members.push_back(std::move(p)); }
120 
121   private:
122     QCString m_name;
123     Vec m_members;
124 };
125 
126 class MemberNameInfoLinkedMap : public LinkedMap<MemberNameInfo>
127 {
128 };
129 
130 #endif
131