LSST Applications g11f7dcd041+3309dba821,g1ce3e0751c+f991eae79d,g28da252d5a+9cd75b2bbf,g2bbee38e9b+b474e213a6,g2bc492864f+b474e213a6,g2cdde0e794+1e3907a55c,g2e95ee2dae+55e7f830ef,g347aa1857d+b474e213a6,g3a166c0a6a+b474e213a6,g4322eb9e3a+f7440700bb,g461a3dce89+b86e4b8053,g52b1c1532d+b86e4b8053,g607f77f49a+d6777fb84b,g78056777b3+b52dbcd3a1,g858d7b2824+d6777fb84b,g8cd86fa7b1+15b40b54d8,g9ddcbc5298+f24b38b85a,ga61afda322+d6777fb84b,gae0086650b+b86e4b8053,gbb886bcc26+69efdcef3b,gbd462c55f0+538be87034,gc120e1dc64+9b164a6ff8,gc28159a63d+b474e213a6,gc2a6998b7e+f95f64aeae,gc30aee3386+6076c0b52b,gcaf7e4fdec+d6777fb84b,gcdd4ae20e8+490f2fb51f,gce08ada175+bde66f6e3f,gcf0d15dbbd+490f2fb51f,gdaeeff99f8+006e14e809,gdbce86181e+61a8f2cffc,ge35ccca647+5538b8be6d,ge3d4d395c2+5a6209b744,ge79ae78c31+b474e213a6,gf048a9a2f4+aeb9e52fbb,w.2024.28
LSST Data Management Base Package
Loading...
Searching...
No Matches
Object.cc
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#include <algorithm>
23#include <functional>
24#include <ostream>
25#include <sstream>
26#include <stdexcept>
27#include <string>
28#include <unordered_map>
29
30#include "astshim/base.h"
32#include "astshim/Object.h"
33#include "astshim/Channel.h"
34#include "astshim/ChebyMap.h"
35#include "astshim/CmpFrame.h"
36#include "astshim/FitsChan.h"
37#include "astshim/FitsTable.h"
38#include "astshim/Frame.h"
39#include "astshim/FrameSet.h"
40#include "astshim/FrameDict.h"
41#include "astshim/KeyMap.h"
42#include "astshim/LutMap.h"
43#include "astshim/MathMap.h"
44#include "astshim/MatrixMap.h"
45#include "astshim/NormMap.h"
46#include "astshim/ParallelMap.h"
47#include "astshim/PcdMap.h"
48#include "astshim/PermMap.h"
49#include "astshim/PolyMap.h"
50#include "astshim/RateMap.h"
51#include "astshim/SeriesMap.h"
52#include "astshim/ShiftMap.h"
53#include "astshim/SkyFrame.h"
54#include "astshim/SlaMap.h"
55#include "astshim/SpecFrame.h"
56#include "astshim/SphMap.h"
57#include "astshim/Table.h"
58#include "astshim/TimeFrame.h"
59#include "astshim/TimeMap.h"
60#include "astshim/TranMap.h"
61#include "astshim/UnitMap.h"
62#include "astshim/UnitNormMap.h"
63#include "astshim/WcsMap.h"
64#include "astshim/WinMap.h"
65#include "astshim/ZoomMap.h"
66
67namespace ast {
68
69namespace {
70
78extern "C" void sinkToOstream(const char *text) {
79 auto osptr = reinterpret_cast<std::ostream *>(astChannelData);
80 (*osptr) << text << std::endl;
81}
82
83} // anonymous namespace
84
85bool Object::operator==(Object const &rhs) const {
86 auto thisStr = this->show(false);
87 auto rhsStr = rhs.show(false);
88 return rhsStr == thisStr;
89}
90
91std::shared_ptr<Object> Object::_basicFromAstObject(AstObject *rawObj) {
93 ClassCasterMap = {
94 {"ChebyMap", makeShim<ChebyMap, AstChebyMap>},
95 {"CmpFrame", makeShim<CmpFrame, AstCmpFrame>},
96 {"FitsChan", makeShim<FitsChan, AstFitsChan>},
97 {"FitsTable", makeShim<FitsTable, AstFitsTable>},
98 {"Frame", makeShim<Frame, AstFrame>},
99 {"FrameSet", makeShim<FrameSet, AstFrameSet>},
100 {"FrameDict", makeShim<FrameDict, AstFrameSet>},
101 {"KeyMap", makeShim<KeyMap, AstKeyMap>},
102 {"LutMap", makeShim<LutMap, AstLutMap>},
103 {"MathMap", makeShim<MathMap, AstMathMap>},
104 {"MatrixMap", makeShim<MatrixMap, AstMatrixMap>},
105 {"NormMap", makeShim<NormMap, AstNormMap>},
106 {"ParallelMap", makeShim<ParallelMap, AstCmpMap>},
107 {"PcdMap", makeShim<PcdMap, AstPcdMap>},
108 {"PermMap", makeShim<PermMap, AstPermMap>},
109 {"PolyMap", makeShim<PolyMap, AstPolyMap>},
110 {"RateMap", makeShim<RateMap, AstRateMap>},
111 {"SeriesMap", makeShim<SeriesMap, AstCmpMap>},
112 {"ShiftMap", makeShim<ShiftMap, AstShiftMap>},
113 {"SkyFrame", makeShim<SkyFrame, AstSkyFrame>},
114 {"SlaMap", makeShim<SlaMap, AstSlaMap>},
115 {"SpecFrame", makeShim<SpecFrame, AstSpecFrame>},
116 {"SphMap", makeShim<SphMap, AstSphMap>},
117 {"TimeFrame", makeShim<TimeFrame, AstTimeFrame>},
118 {"Table", makeShim<Table, AstTable>},
119 {"TimeMap", makeShim<TimeMap, AstTimeMap>},
120 {"TranMap", makeShim<TranMap, AstTranMap>},
121 {"UnitMap", makeShim<UnitMap, AstUnitMap>},
122 {"UnitNormMap", makeShim<UnitNormMap, AstUnitNormMap>},
123 {"WcsMap", makeShim<WcsMap, AstWcsMap>},
124 {"WinMap", makeShim<WinMap, AstWinMap>},
125 {"ZoomMap", makeShim<ZoomMap, AstZoomMap>},
126 };
127 assertOK(rawObj);
128 auto className = detail::getClassName(rawObj);
129 auto name_caster = ClassCasterMap.find(className);
130 if (name_caster == ClassCasterMap.end()) {
131 astAnnul(rawObj);
132 throw std::runtime_error("Class " + className + " not supported");
133 }
134 return name_caster->second(rawObj);
135}
136
137template <typename Class>
138std::shared_ptr<Class> Object::fromAstObject(AstObject *rawObj, bool copy) {
139 AstObject *rawObjCopy = rawObj;
140 if (copy) {
141 rawObjCopy = reinterpret_cast<AstObject *>(astCopy(rawObj));
142 astAnnul(rawObj);
143 }
144 assertOK(rawObjCopy);
145
146 // Make the appropriate ast shim object and dynamically cast to the desired output type
147 auto retObjectBeforeCast = Object::_basicFromAstObject(rawObjCopy);
148 auto retObject = std::dynamic_pointer_cast<Class>(retObjectBeforeCast);
149 if (!retObject) {
151 os << "The component is of type " << retObject->getClassName()
152 << ", which could not be cast to the desired type " << typeid(Class).name();
153 throw std::runtime_error(os.str());
154 }
155 return retObject;
156}
157
158void Object::show(std::ostream &os, bool showComments) const {
159 Stream stream(nullptr, &os);
160 Channel ch(stream, showComments ? "" : "Comment=0");
161 ch.write(*this);
162 assertOK();
163}
164
165std::string Object::show(bool showComments) const {
167 show(os, showComments);
168 return os.str();
169}
170
171Object::Object(AstObject *object) : _objPtr(object, &detail::annulAstObject) {
172 assertOK();
173 if (!object) {
174 throw std::runtime_error("Null pointer");
175 }
176}
177
178int Object::getI(std::string const &attrib) const {
179 int val = astGetI(getRawPtr(), attrib.c_str());
180 assertOK();
181 return val;
182}
183
184// Explicit instantiations
185template std::shared_ptr<KeyMap> Object::fromAstObject<KeyMap>(AstObject *, bool);
186template std::shared_ptr<FitsChan> Object::fromAstObject<FitsChan>(AstObject *, bool);
187template std::shared_ptr<FrameSet> Object::fromAstObject<FrameSet>(AstObject *, bool);
188template std::shared_ptr<Frame> Object::fromAstObject<Frame>(AstObject *, bool);
189template std::shared_ptr<Mapping> Object::fromAstObject<Mapping>(AstObject *, bool);
190template std::shared_ptr<Object> Object::fromAstObject<Object>(AstObject *, bool);
191
192} // namespace ast
table::Key< std::string > name
Definition Amplifier.cc:116
std::ostream * os
Definition Schema.cc:557
T c_str(T... args)
Channel provides input/output of AST objects.
Definition Channel.h:60
int write(Object const &object)
Write an object to a channel.
Definition Channel.cc:61
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
void show(std::ostream &os, bool showComments=true) const
Print a textual description the object to an ostream.
Definition Object.cc:158
int getI(std::string const &attrib) const
Get the value of an attribute as an int.
Definition Object.cc:178
Object(Object const &object)
Copy constructor: make a deep copy.
Definition Object.h:64
AstObject const * getRawPtr() const
Get the raw AST pointer.
Definition Object.h:292
bool operator==(Object const &rhs) const
Return True if this and rhs are the equal.
Definition Object.cc:85
A stream for ast::Channel.
Definition Stream.h:41
T endl(T... args)
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