LSST Applications g0afe43252f+b86e4b8053,g0e535e6de9+ad13c1b82d,g11f7dcd041+017865fdd3,g1ce3e0751c+f991eae79d,g25e82e299b+da9c58a417,g28da252d5a+9a4345bd89,g2bbee38e9b+b6588ad223,g2bc492864f+b6588ad223,g2cdde0e794+8523d0dbb4,g347aa1857d+b6588ad223,g35bb328faa+b86e4b8053,g3a166c0a6a+b6588ad223,g461a3dce89+b86e4b8053,g52b1c1532d+b86e4b8053,g7d11c3e888+3343bff751,g80478fca09+f22f659b46,g8543c18506+fadcf71ecf,g858d7b2824+c704b22fcc,g8cd86fa7b1+497903d09f,g965a9036f2+c704b22fcc,g979bb04a14+43c1c4070b,g9ddcbc5298+f24b38b85a,gae0086650b+b86e4b8053,gb781091699+0f9934ae6f,gbb886bcc26+486567bf06,gc28159a63d+b6588ad223,gc30aee3386+a2f0f6cab9,gc9f6898e11+66e322ebb3,gcaf7e4fdec+c704b22fcc,gcd45df26be+c704b22fcc,gcdd4ae20e8+02080e1d2d,gcf0d15dbbd+02080e1d2d,gdaeeff99f8+006e14e809,gdbce86181e+42405ade82,ge3d4d395c2+224150c836,ge79ae78c31+b6588ad223,gf048a9a2f4+69e41b07e6,gf0baf85859+b4cca3d10f,w.2024.30
LSST Data Management Base Package
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
109 std::shared_ptr<Object> copy() const { return std::static_pointer_cast<Object>(copyPolymorphic()); }
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
202 void lock(bool wait) {
203 astLock(getRawPtr(), static_cast<int>(wait));
204 assertOK();
205 }
206
212 bool same(Object const &other) const { return astSame(getRawPtr(), other.getRawPtr()); }
213
215 void setID(std::string const &id) { setC("ID", id); }
216
218 void setIdent(std::string const &ident) { setC("Ident", ident); }
219
221 void setUseDefs(bool usedefs) { setB("UseDefs", usedefs); }
222
229 void show(std::ostream &os, bool showComments = true) const;
230
236 std::string show(bool showComments = true) const;
237
250 bool test(std::string const &attrib) const {
251 bool res = astTest(getRawPtr(), attrib.c_str());
252 assertOK();
253 return res;
254 }
255
280 void unlock(bool report = false) {
281 astUnlock(getRawPtr(), static_cast<int>(report));
282 assertOK();
283 }
284
292 AstObject const *getRawPtr() const { return &*_objPtr; };
293
294 AstObject *getRawPtr() { return &*_objPtr; };
296
297protected:
301 explicit Object(AstObject *object);
302
309 template <typename ShimT, typename AstT>
310 static std::shared_ptr<ShimT> makeShim(AstObject *p) {
311 return std::shared_ptr<ShimT>(new ShimT(reinterpret_cast<AstT *>(p)));
312 }
313
319 template <typename T, typename AstT>
321 auto *rawptr = reinterpret_cast<AstT *>(astCopy(getRawPtr()));
322 auto retptr = std::shared_ptr<T>(new T(rawptr));
323 assertOK();
324 return retptr;
325 }
326
340
348 bool getB(std::string const &attrib) const {
349 bool val = astGetI(getRawPtr(), attrib.c_str());
350 assertOK();
351 return val;
352 }
353
361 std::string const getC(std::string const &attrib) const {
362 char const *rawval = astGetC(getRawPtr(), attrib.c_str());
363 assertOK();
364 return std::string(rawval);
365 }
366
374 double getD(std::string const &attrib) const {
375 double val = astGetD(getRawPtr(), attrib.c_str());
376 assertOK();
377 return val;
378 }
379
387 float getF(std::string const &attrib) const {
388 float val = astGetF(getRawPtr(), attrib.c_str());
389 assertOK();
390 return val;
391 }
392
400 int getI(std::string const &attrib) const;
401
409 long int getL(std::string const &attrib) const {
410 long int val = astGetL(getRawPtr(), attrib.c_str());
411 assertOK();
412 return val;
413 }
414
436 void set(std::string const &setting) {
437 astSet(getRawPtr(), "%s", setting.c_str());
438 assertOK();
439 }
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 }
512private:
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
T c_str(T... args)
A FrameSet whose frames can be referenced by domain name.
Definition FrameDict.h:67
A Mapping split off as a subset of another Mapping.
Definition MapSplit.h:38
Abstract base class for all AST objects.
Definition Object.h:51
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:138
Object(Object &&)=default
Object & operator=(Object &&)=default
void lock(bool wait)
Lock this object for exclusive use by the calling thread.
Definition Object.h:202
void show(std::ostream &os, bool showComments=true) const
Print a textual description the object to an ostream.
Definition Object.cc:158
std::shared_ptr< T > copyImpl() const
Implementation of deep copy.
Definition Object.h:320
bool same(Object const &other) const
Does this contain the same AST object as another?
Definition Object.h:212
void setD(std::string const &attrib, double value)
Set the value of an attribute as a double.
Definition Object.h:472
bool operator!=(Object const &rhs) const
Return True if this and rhs are not equal.
Definition Object.h:82
double getD(std::string const &attrib) const
Get the value of an attribute as a double.
Definition Object.h:374
void setL(std::string const &attrib, long int value)
Set the value of an attribute as a long int.
Definition Object.h:508
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:294
long int getL(std::string const &attrib) const
Get the value of an attribute as a long int.
Definition Object.h:409
std::string const getC(std::string const &attrib) const
Get the value of an attribute as a string.
Definition Object.h:361
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:496
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:310
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:250
bool getB(std::string const &attrib) const
Get the value of an attribute as a bool.
Definition Object.h:348
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:215
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:178
void setF(std::string const &attrib, float value)
Set the value of an attribute as a float.
Definition Object.h:484
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:280
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:460
float getF(std::string const &attrib) const
Get the value of an attribute as a float.
Definition Object.h:387
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:436
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:448
Object & operator=(Object const &)=delete
AstObject const * getRawPtr() const
Get the raw AST pointer.
Definition Object.h:292
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:218
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:221
bool operator==(Object const &rhs) const
Return True if this and rhs are the equal.
Definition Object.cc:85
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.
void assertOK(AstObject *rawPtr1=nullptr, AstObject *rawPtr2=nullptr)
Throw std::runtime_error if AST's state is bad.
Definition base.cc:49
ImageT val
Definition CR.cc:146