lsst.astshim  17.0+5
Object.h
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2017 AURA/LSST.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <https://www.lsstcorp.org/LegalNotices/>.
21  */
22 #ifndef ASTSHIM_OBJECT_H
23 #define ASTSHIM_OBJECT_H
24 
25 #include <ostream>
26 #include <memory>
27 
28 #include "astshim/base.h"
29 #include "astshim/detail/utils.h"
30 #include "astshim/MapSplit.h"
31 
32 namespace ast {
33 
34 class FrameDict;
35 
51 class Object {
52  friend class MapSplit;
53  friend class FrameDict;
54 
55 private:
56  using Deleter = void (*)(AstObject *);
57 
58 public:
59  using ObjectPtr = std::unique_ptr<AstObject, Deleter>;
60 
61  virtual ~Object() {}
62 
64  Object(Object const &object) : _objPtr(object.getRawPtrCopy(), &detail::annulAstObject) {}
65  Object(Object &&) = default;
66  Object &operator=(Object const &) = delete;
67  Object &operator=(Object &&) = default;
68 
75  bool operator==(Object const &rhs) const;
76 
82  bool operator!=(Object const &rhs) const {
83  return !(*this == rhs); };
84 
88  static std::shared_ptr<Object> fromString(std::string const &str) {
89  auto *rawPtr = reinterpret_cast<AstObject *>(astFromString(str.c_str()));
90  return Object::_basicFromAstObject(rawPtr);
91  }
92 
104  template <typename Class>
105  static std::shared_ptr<Class> fromAstObject(AstObject *rawObj, bool copy);
106 
108  std::shared_ptr<Object> copy() const { return std::static_pointer_cast<Object>(copyPolymorphic()); }
109 
118  void clear(std::string const &attrib) {
119  astClear(getRawPtr(), attrib.c_str());
120  assertOK();
121  }
122 
126  bool hasAttribute(std::string const &attrib) const {
127  bool ret = astHasAttribute(getRawPtr(), attrib.c_str());
128  assertOK();
129  return ret;
130  }
131 
138  std::string getClassName() const { return detail::getClassName(getRawPtr()); }
139 
141  std::string getID() const { return getC("ID"); }
142 
144  std::string getIdent() const { return getC("Ident"); }
145 
152  int getNObject() const { return getI("NObject"); }
153 
155  int getObjSize() const { return getI("ObjSize"); }
156 
162  int getRefCount() const { return getI("RefCount"); }
163 
165  bool getUseDefs() const { return getB("UseDefs"); }
166 
201  void lock(bool wait) {
202  astLock(getRawPtr(), static_cast<int>(wait));
203  assertOK();
204  }
205 
211  bool same(Object const &other) const { return astSame(getRawPtr(), other.getRawPtr()); }
212 
214  void setID(std::string const &id) { setC("ID", id); }
215 
217  void setIdent(std::string const &ident) { setC("Ident", ident); }
218 
220  void setUseDefs(bool usedefs) { setB("UseDefs", usedefs); }
221 
228  void show(std::ostream &os, bool showComments = true) const;
229 
235  std::string show(bool showComments = true) const;
236 
249  bool test(std::string const &attrib) const {
250  bool res = astTest(getRawPtr(), attrib.c_str());
251  assertOK();
252  return res;
253  }
254 
279  void unlock(bool report = false) {
280  astUnlock(getRawPtr(), static_cast<int>(report));
281  assertOK();
282  }
283 
291  AstObject const *getRawPtr() const { return &*_objPtr; };
292 
293  AstObject *getRawPtr() { return &*_objPtr; };
295 
296 protected:
300  explicit Object(AstObject *object);
301 
308  template <typename ShimT, typename AstT>
309  static std::shared_ptr<ShimT> makeShim(AstObject *p) {
310  return std::shared_ptr<ShimT>(new ShimT(reinterpret_cast<AstT *>(p)));
311  }
312 
318  template <typename T, typename AstT>
319  std::shared_ptr<T> copyImpl() const {
320  auto *rawptr = reinterpret_cast<AstT *>(astCopy(getRawPtr()));
321  auto retptr = std::shared_ptr<T>(new T(rawptr));
322  assertOK();
323  return retptr;
324  }
325 
338  virtual std::shared_ptr<Object> copyPolymorphic() const = 0;
339 
347  bool getB(std::string const &attrib) const {
348  bool val = astGetI(getRawPtr(), attrib.c_str());
349  assertOK();
350  return val;
351  }
352 
360  std::string const getC(std::string const &attrib) const {
361  char const *rawval = astGetC(getRawPtr(), attrib.c_str());
362  assertOK();
363  return std::string(rawval);
364  }
365 
373  double getD(std::string const &attrib) const {
374  double val = astGetD(getRawPtr(), attrib.c_str());
375  assertOK();
376  return val;
377  }
378 
386  float getF(std::string const &attrib) const {
387  float val = astGetF(getRawPtr(), attrib.c_str());
388  assertOK();
389  return val;
390  }
391 
399  int getI(std::string const &attrib) const {
400  int val = astGetI(getRawPtr(), attrib.c_str());
401  assertOK();
402  return val;
403  }
404 
412  long int getL(std::string const &attrib) const {
413  long int val = astGetL(getRawPtr(), attrib.c_str());
414  assertOK();
415  return val;
416  }
417 
439  void set(std::string const &setting) { astSet(getRawPtr(), "%s", setting.c_str()); }
440 
448  void setB(std::string const &attrib, bool value) {
449  astSetI(getRawPtr(), attrib.c_str(), value);
450  assertOK();
451  }
452 
460  void setC(std::string const &attrib, std::string const &value) {
461  astSetC(getRawPtr(), attrib.c_str(), value.c_str());
462  assertOK();
463  }
464 
472  void setD(std::string const &attrib, double value) {
473  astSetD(getRawPtr(), attrib.c_str(), value);
474  assertOK();
475  }
476 
484  void setF(std::string const &attrib, float value) {
485  astSetF(getRawPtr(), attrib.c_str(), value);
486  assertOK();
487  }
488 
496  void setI(std::string const &attrib, int value) {
497  astSetI(getRawPtr(), attrib.c_str(), value);
498  assertOK();
499  }
500 
508  void setL(std::string const &attrib, long int value) {
509  astSetL(getRawPtr(), attrib.c_str(), value);
510  assertOK();
511  }
512 private:
513  /*
514  Given a bare AST object pointer return a shared pointer to an ast::Object of the correct type
515 
516  The returned object takes ownership of the pointer. This is almost always what you want,
517  for instance astDecompose returns shallow copies of the internal pointers.
518 
519  @param[in] rawObj A bare AST object pointer
520  */
521  static std::shared_ptr<Object> _basicFromAstObject(AstObject *rawObj);
522 
523  /*
524  Get a deep copy of the raw AST pointer.
525  */
526  AstObject * getRawPtrCopy() const {
527  AstObject * rawPtrCopy = reinterpret_cast<AstObject *>(astCopy(getRawPtr()));
528  assertOK(rawPtrCopy);
529  return rawPtrCopy;
530  }
531 
532  /*
533  Swap the raw object pointers between this and another object
534  */
535  void swapRawPointers(Object &other) noexcept {
536  swap(_objPtr, other._objPtr);
537  }
538 
539  ObjectPtr _objPtr;
540 };
541 
542 } // namespace ast
543 
544 #endif
bool test(std::string const &attrib) const
Definition: Object.h:249
AstObject * getRawPtr()
Definition: Object.h:293
Object & operator=(Object const &)=delete
void annulAstObject(AstObject *object)
A wrapper around astAnnul; intended as a custom deleter for std::unique_ptr.
Definition: utils.h:40
AstObject const * getRawPtr() const
Definition: Object.h:291
long int getL(std::string const &attrib) const
Definition: Object.h:412
void setB(std::string const &attrib, bool value)
Definition: Object.h:448
int getI(std::string const &attrib) const
Definition: Object.h:399
AST wrapper classes and functions.
Definition: attributes_channel.dox:1
std::string getClassName() const
Definition: Object.h:138
void assertOK(AstObject *rawPtr1=nullptr, AstObject *rawPtr2=nullptr)
Definition: base.cc:49
virtual std::shared_ptr< Object > copyPolymorphic() const =0
void setUseDefs(bool usedefs)
Set UseDefs: allow use of default values for Object attributes?
Definition: Object.h:220
std::shared_ptr< T > copyImpl() const
Definition: Object.h:319
std::shared_ptr< Object > copy() const
Return a deep copy of this object.
Definition: Object.h:108
void setL(std::string const &attrib, long int value)
Definition: Object.h:508
std::unique_ptr< AstObject, Deleter > ObjectPtr
unique pointer holding an AST raw pointer
Definition: Object.h:59
bool hasAttribute(std::string const &attrib) const
Definition: Object.h:126
static std::shared_ptr< Class > fromAstObject(AstObject *rawObj, bool copy)
Definition: Object.cc:132
std::string getID() const
Get ID: object identification string that is not copied.
Definition: Object.h:141
Object(Object const &object)
Copy constructor: make a deep copy.
Definition: Object.h:64
int getObjSize() const
Get ObjSize: the in-memory size of the AST object in bytes.
Definition: Object.h:155
bool getB(std::string const &attrib) const
Definition: Object.h:347
void unlock(bool report=false)
Definition: Object.h:279
Definition: MapSplit.h:38
bool getUseDefs() const
Get UseDefs: allow use of default values for Object attributes?
Definition: Object.h:165
void setC(std::string const &attrib, std::string const &value)
Definition: Object.h:460
static std::shared_ptr< ShimT > makeShim(AstObject *p)
Definition: Object.h:309
void setID(std::string const &id)
Set ID: object identification string that is not copied.
Definition: Object.h:214
virtual ~Object()
Definition: Object.h:61
std::string getIdent() const
Get Ident: object identification string that is copied.
Definition: Object.h:144
std::string getClassName(AstObject const *rawObj)
Definition: utils.cc:37
void setF(std::string const &attrib, float value)
Definition: Object.h:484
bool same(Object const &other) const
Definition: Object.h:211
int getRefCount() const
Definition: Object.h:162
void setIdent(std::string const &ident)
Set Ident: object identification string that is copied.
Definition: Object.h:217
void setD(std::string const &attrib, double value)
Definition: Object.h:472
int getNObject() const
Definition: Object.h:152
double getD(std::string const &attrib) const
Definition: Object.h:373
static std::shared_ptr< Object > fromString(std::string const &str)
Definition: Object.h:88
void show(std::ostream &os, bool showComments=true) const
Definition: Object.cc:152
float getF(std::string const &attrib) const
Definition: Object.h:386
void setI(std::string const &attrib, int value)
Definition: Object.h:496
std::string const getC(std::string const &attrib) const
Definition: Object.h:360
Definition: FrameDict.h:67
Definition: Object.h:51
bool operator==(Object const &rhs) const
Definition: Object.cc:82
bool operator!=(Object const &rhs) const
Definition: Object.h:82
void clear(std::string const &attrib)
Definition: Object.h:118
void lock(bool wait)
Definition: Object.h:201