lsst.astshim g6483cd21eb+3aebfb091a
Loading...
Searching...
No Matches
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"
30#include "astshim/MapSplit.h"
31
32namespace ast {
33
34class FrameDict;
35
51class Object {
52 friend class MapSplit;
53 friend class FrameDict;
54
55private:
56 using Deleter = void (*)(AstObject *);
57
58public:
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
89 auto *rawPtr = reinterpret_cast<AstObject *>(astFromString(str.c_str()));
90 assertOK(rawPtr);
91 return Object::_basicFromAstObject(rawPtr);
92 }
93
105 template <typename Class>
106 static std::shared_ptr<Class> fromAstObject(AstObject *rawObj, bool copy);
107
110
119 void clear(std::string const &attrib) {
120 astClear(getRawPtr(), attrib.c_str());
121 assertOK();
122 }
123
127 bool hasAttribute(std::string const &attrib) const {
128 bool ret = astHasAttribute(getRawPtr(), attrib.c_str());
129 assertOK();
130 return ret;
131 }
132
140
142 std::string getID() const { return getC("ID"); }
143
145 std::string getIdent() const { return getC("Ident"); }
146
153 int getNObject() const { return getI("NObject"); }
154
156 int getObjSize() const { return getI("ObjSize"); }
157
163 int getRefCount() const { return getI("RefCount"); }
164
166 bool getUseDefs() const { return getB("UseDefs"); }
167
205 void lock(bool wait) {
206 astLock(getRawPtr(), static_cast<int>(wait));
207 assertOK();
208 }
209
215 bool same(Object const &other) const { return astSame(getRawPtr(), other.getRawPtr()); }
216
218 void setID(std::string const &id) { setC("ID", id); }
219
221 void setIdent(std::string const &ident) { setC("Ident", ident); }
222
224 void setUseDefs(bool usedefs) { setB("UseDefs", usedefs); }
225
232 void show(std::ostream &os, bool showComments = true) const;
233
239 std::string show(bool showComments = true) const;
240
253 bool test(std::string const &attrib) const {
254 bool res = astTest(getRawPtr(), attrib.c_str());
255 assertOK();
256 return res;
257 }
258
283 void unlock(bool report = false) {
284 astUnlock(getRawPtr(), static_cast<int>(report));
285 assertOK();
286 }
287
295 AstObject const *getRawPtr() const { return &*_objPtr; };
296
297 AstObject *getRawPtr() { return &*_objPtr; };
299
300protected:
304 explicit Object(AstObject *object);
305
312 template <typename ShimT, typename AstT>
313 static std::shared_ptr<ShimT> makeShim(AstObject *p) {
314 return std::shared_ptr<ShimT>(new ShimT(reinterpret_cast<AstT *>(p)));
315 }
316
322 template <typename T, typename AstT>
324 auto *rawptr = reinterpret_cast<AstT *>(astCopy(getRawPtr()));
325 auto retptr = std::shared_ptr<T>(new T(rawptr));
326 assertOK();
327 return retptr;
328 }
329
343
351 bool getB(std::string const &attrib) const {
352 bool val = astGetI(getRawPtr(), attrib.c_str());
353 assertOK();
354 return val;
355 }
356
364 std::string const getC(std::string const &attrib) const {
365 char const *rawval = astGetC(getRawPtr(), attrib.c_str());
366 assertOK();
367 return std::string(rawval);
368 }
369
377 double getD(std::string const &attrib) const {
378 double val = astGetD(getRawPtr(), attrib.c_str());
379 assertOK();
380 return val;
381 }
382
390 float getF(std::string const &attrib) const {
391 float val = astGetF(getRawPtr(), attrib.c_str());
392 assertOK();
393 return val;
394 }
395
403 int getI(std::string const &attrib) const;
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) {
440 astSet(getRawPtr(), "%s", setting.c_str());
441 assertOK();
442 }
443
451 void setB(std::string const &attrib, bool value) {
452 astSetI(getRawPtr(), attrib.c_str(), value);
453 assertOK();
454 }
455
463 void setC(std::string const &attrib, std::string const &value) {
464 astSetC(getRawPtr(), attrib.c_str(), value.c_str());
465 assertOK();
466 }
467
475 void setD(std::string const &attrib, double value) {
476 astSetD(getRawPtr(), attrib.c_str(), value);
477 assertOK();
478 }
479
487 void setF(std::string const &attrib, float value) {
488 astSetF(getRawPtr(), attrib.c_str(), value);
489 assertOK();
490 }
491
499 void setI(std::string const &attrib, int value) {
500 astSetI(getRawPtr(), attrib.c_str(), value);
501 assertOK();
502 }
503
511 void setL(std::string const &attrib, long int value) {
512 astSetL(getRawPtr(), attrib.c_str(), value);
513 assertOK();
514 }
515private:
516 /*
517 Given a bare AST object pointer return a shared pointer to an ast::Object of the correct type
518
519 The returned object takes ownership of the pointer. This is almost always what you want,
520 for instance astDecompose returns shallow copies of the internal pointers.
521
522 @param[in] rawObj A bare AST object pointer
523 */
524 static std::shared_ptr<Object> _basicFromAstObject(AstObject *rawObj);
525
526 /*
527 Get a deep copy of the raw AST pointer.
528 */
529 AstObject * getRawPtrCopy() const {
530 AstObject * rawPtrCopy = reinterpret_cast<AstObject *>(astCopy(getRawPtr()));
531 assertOK(rawPtrCopy);
532 return rawPtrCopy;
533 }
534
535 /*
536 Swap the raw object pointers between this and another object
537 */
538 void swapRawPointers(Object &other) noexcept {
539 swap(_objPtr, other._objPtr);
540 }
541
542 ObjectPtr _objPtr;
543};
544
545} // namespace ast
546
547#endif
T c_str(T... args)
A FrameSet whose frames can be referenced by domain name.
Definition FrameDict.h:67
static std::shared_ptr< Class > fromAstObject(AstObject *rawObj, bool copy)
Given a bare AST object pointer return a shared pointer to an ast::Object of the correct type.
Definition Object.cc:140
Object(Object &&)=default
Object & operator=(Object &&)=default
void lock(bool wait)
Lock this object for exclusive use by the calling thread.
Definition Object.h:205
void show(std::ostream &os, bool showComments=true) const
Print a textual description the object to an ostream.
Definition Object.cc:160
std::shared_ptr< T > copyImpl() const
Implementation of deep copy.
Definition Object.h:323
bool same(Object const &other) const
Does this contain the same AST object as another?
Definition Object.h:215
void setD(std::string const &attrib, double value)
Set the value of an attribute as a double.
Definition Object.h:475
bool operator!=(Object const &rhs) const
Return True if this and rhs are not equal.
Definition Object.h:82
friend class MapSplit
Definition Object.h:52
double getD(std::string const &attrib) const
Get the value of an attribute as a double.
Definition Object.h:377
void setL(std::string const &attrib, long int value)
Set the value of an attribute as a long int.
Definition Object.h:511
std::shared_ptr< Object > copy() const
Return a deep copy of this object.
Definition Object.h:109
AstObject * getRawPtr()
Get the raw AST pointer.
Definition Object.h:297
long int getL(std::string const &attrib) const
Get the value of an attribute as a long int.
Definition Object.h:412
std::string const getC(std::string const &attrib) const
Get the value of an attribute as a string.
Definition Object.h:364
std::string getClassName() const
Get Class: the name of the class (e.g.
Definition Object.h:139
void setI(std::string const &attrib, int value)
Set the value of an attribute as an int.
Definition Object.h:499
static std::shared_ptr< ShimT > makeShim(AstObject *p)
Functor to make an astshim instance from a raw AST pointer of the corresponding type.
Definition Object.h:313
virtual std::shared_ptr< Object > copyPolymorphic() const =0
Return a deep copy of this object.
bool test(std::string const &attrib) const
Has this attribute been explicitly set (and not subsequently cleared)?
Definition Object.h:253
bool getB(std::string const &attrib) const
Get the value of an attribute as a bool.
Definition Object.h:351
friend class FrameDict
Definition Object.h:53
bool getUseDefs() const
Get UseDefs: allow use of default values for Object attributes?
Definition Object.h:166
void setID(std::string const &id)
Set ID: object identification string that is not copied.
Definition Object.h:218
std::string getID() const
Get ID: object identification string that is not copied.
Definition Object.h:142
void clear(std::string const &attrib)
Clear the values of a specified set of attributes for an Object.
Definition Object.h:119
virtual ~Object()
Definition Object.h:61
int getI(std::string const &attrib) const
Get the value of an attribute as an int.
Definition Object.cc:180
void setF(std::string const &attrib, float value)
Set the value of an attribute as a float.
Definition Object.h:487
static std::shared_ptr< Object > fromString(std::string const &str)
Construct an Object from a string, using astFromString.
Definition Object.h:88
void unlock(bool report=false)
Unlock this object previously locked using lock, so that other threads can use this object.
Definition Object.h:283
std::unique_ptr< AstObject, Deleter > ObjectPtr
unique pointer holding an AST raw pointer
Definition Object.h:59
void setC(std::string const &attrib, std::string const &value)
Set the value of an attribute as a string.
Definition Object.h:463
float getF(std::string const &attrib) const
Get the value of an attribute as a float.
Definition Object.h:390
Object(Object const &object)
Copy constructor: make a deep copy.
Definition Object.h:64
std::string getIdent() const
Get Ident: object identification string that is copied.
Definition Object.h:145
void set(std::string const &setting)
Assign a set of attribute values, over-riding any previous values.
Definition Object.h:439
int getObjSize() const
Get ObjSize: the in-memory size of the AST object in bytes.
Definition Object.h:156
void setB(std::string const &attrib, bool value)
Set the value of an attribute as a bool.
Definition Object.h:451
Object & operator=(Object const &)=delete
AstObject const * getRawPtr() const
Get the raw AST pointer.
Definition Object.h:295
int getNObject() const
Get NObject: number of AST objects in existence of the same type as the underlying AST class.
Definition Object.h:153
void setIdent(std::string const &ident)
Set Ident: object identification string that is copied.
Definition Object.h:221
bool hasAttribute(std::string const &attrib) const
Does this object have an attribute with the specified name?
Definition Object.h:127
void setUseDefs(bool usedefs)
Set UseDefs: allow use of default values for Object attributes?
Definition Object.h:224
bool operator==(Object const &rhs) const
Return True if this and rhs are the equal.
Definition Object.cc:86
int getRefCount() const
Get RefCount: number of active pointers to the underlying AST object.
Definition Object.h:163
std::string getClassName(AstObject const *rawObj)
Get the AST class name, changing CmpMap to SeriesMap or ParallelMap as appropriate.
Definition utils.cc:37
AST wrapper classes and functions.
*Return a deep copy of this object std::shared_ptr< Frame > copy() const
Definition Frame.h:182
void assertOK(AstObject *rawPtr1=nullptr, AstObject *rawPtr2=nullptr)
Throw std::runtime_error if AST's state is bad.
Definition base.cc:49
T static_pointer_cast(T... args)