Free Electron
PathAccessor.h
Go to the documentation of this file.
1 /* Copyright (C) 2003-2021 Free Electron Organization
2  Any use of this software requires a license. If a valid license
3  was not distributed with this file, visit freeelectron.org. */
4 
5 /** @file */
6 
7 #ifndef __data_PathAccessor_h__
8 #define __data_PathAccessor_h__
9 
10 #ifdef FE_BOOST_TOKENIZER
11 #include <boost/tokenizer.hpp>
12 #endif
13 
14 namespace fe
15 {
16 
17 class FE_DL_EXPORT VoidAccessor
18 {
19  public:
20  VoidAccessor(void);
21  VoidAccessor(const String &a_path);
22  ~VoidAccessor(void);
23  VoidAccessor &operator=(const String &a_path);
24 
25  void setup( const String &a_path);
26 
27  void *access(const Record r_in, sp<Attribute> &a_rspAttr);
28 
29  String path(void);
30 
31  protected:
32  std::list<String> m_path;
33  String m_last;
34  String m_sep;
35 };
36 
37 template <class T>
38 class FE_DL_EXPORT PathAccessor : public VoidAccessor
39 {
40  public:
41  PathAccessor(void);
42  PathAccessor(const String &a_path);
43  ~PathAccessor(void);
44  T *operator()(const Record record);
45 
46 };
47 
48 template <class T>
49 class FE_DL_EXPORT ScopedPathAccessor
50 {
51  public:
52  ScopedPathAccessor(void);
53  ScopedPathAccessor(sp<Scope> a_scope, const String &a_path);
54  ~ScopedPathAccessor(void);
55  void setup(sp<Scope> a_scope, const String &a_path);
56  T *operator()(const Record record);
57  T *operator()(sp<RecordArray>& rspRA, FE_UWORD a_i);
58  private:
59  Array< Accessor<Record> > m_path;
60  Accessor<T> m_last;
61 };
62 
63 template <class T>
64 ScopedPathAccessor<T>::ScopedPathAccessor(void)
65 {
66 }
67 
68 template <class T>
69 ScopedPathAccessor<T>::ScopedPathAccessor(sp<Scope> a_scope,
70  const String &a_path)
71 {
72  setup(a_scope, a_path);
73 }
74 
75 template <class T>
76 ScopedPathAccessor<T>::~ScopedPathAccessor(void)
77 {
78 }
79 
80 template <class T>
81 void ScopedPathAccessor<T>::setup(sp<Scope> a_scope, const String &a_path)
82 {
83  m_path.clear();
84 
85  Array<std::string> tokens;
86 
87 #ifdef FE_BOOST_TOKENIZER
88  boost::char_separator<char> sep(".");
89  typedef boost::tokenizer<boost::char_separator<char> > t_tokenizer;
90  std::string std_str = a_path.c_str();
91  t_tokenizer tokenizer(std_str, sep);
92  for(t_tokenizer::iterator i_t = tokenizer.begin();
93  i_t != tokenizer.end(); ++i_t)
94  {
95  tokens.push_back(*i_t);
96  }
97 #else
98  String buffer=a_path.c_str();
99  String token;
100  while(!(token=buffer.parse("",".")).empty())
101  {
102  tokens.push_back(token.c_str());
103  }
104 #endif
105 
106  if(tokens.size() == 0)
107  {
108  return;
109  }
110 
111  m_path.resize(tokens.size()-1);
112 
113  for(unsigned int i = 0; i < m_path.size(); i++)
114  {
115  m_path[i].setup(a_scope, tokens[i].c_str());
116  }
117  m_last.setup(a_scope, tokens[tokens.size()-1].c_str());
118 }
119 
120 template <class T>
121 T *ScopedPathAccessor<T>::operator()(const Record r_in)
122 {
123  if(m_last.index() == 0) { return NULL; }
124  Record r_a = r_in;
125  for(unsigned int i = 0; i < m_path.size(); i++)
126  {
127  Record *pRecord = m_path[i].queryAttribute(r_a);
128  if(pRecord && pRecord->isValid())
129  {
130  r_a = *pRecord;
131  }
132  else
133  {
134  return NULL;
135  }
136  }
137 
138  return m_last.queryAttribute(r_a);
139 }
140 
141 
142 template <class T>
143 T *ScopedPathAccessor<T>::operator()(sp<RecordArray>& rspRA, FE_UWORD a_i)
144 {
145  Record r_a = rspRA->getRecord(a_i);
146  return (*this)(r_a);
147 }
148 
149 template <class T>
150 PathAccessor<T>::PathAccessor(void)
151 {
152 }
153 
154 template <class T>
155 PathAccessor<T>::PathAccessor(const String &a_path)
156  : VoidAccessor(a_path)
157 {
158 }
159 
160 template <class T>
161 PathAccessor<T>::~PathAccessor(void)
162 {
163 }
164 
165 template <class T>
166 T *PathAccessor<T>::operator()(const Record r_in)
167 {
168  if(m_last == "") { return NULL; }
169  FE_UWORD i;
170  Record r_a = r_in;
171  for(std::list<String>::iterator i_r = m_path.begin();
172  i_r != m_path.end(); i_r++)
173  {
174  sp<Attribute> &attr = r_a.layout()->scope()->findAttribute(*i_r, i);
175  if(!attr.isValid())
176  {
177  return NULL;
178  }
179  if(!r_a.layout()->checkAttribute(i))
180  {
181  return NULL;
182  }
183  r_a = r_a.accessAttribute<Record>(i);
184  if(!r_a.isValid())
185  {
186  return NULL;
187  }
188  }
189  sp<Attribute> &attr = r_a.layout()->scope()->findAttribute(m_last, i);
190  if(!attr.isValid())
191  {
192  return NULL;
193  }
194  if(!r_a.layout()->checkAttribute(i))
195  {
196  return NULL;
197  }
198  return &(r_a.accessAttribute<T>(i));
199 }
200 
201 
202 
203 } /* namespace */
204 
205 #endif /* __data_PathAccessor_h__ */
206 
kernel
Definition: namespace.dox:3
sp< Layout > layout(void) const
Return the Layout.
Definition: RecordSB.h:189