LSST Applications  21.0.0+04719a4bac,21.0.0-1-ga51b5d4+f5e6047307,21.0.0-11-g2b59f77+a9c1acf22d,21.0.0-11-ga42c5b2+86977b0b17,21.0.0-12-gf4ce030+76814010d2,21.0.0-13-g1721dae+760e7a6536,21.0.0-13-g3a573fe+768d78a30a,21.0.0-15-g5a7caf0+f21cbc5713,21.0.0-16-g0fb55c1+b60e2d390c,21.0.0-19-g4cded4ca+71a93a33c0,21.0.0-2-g103fe59+bb20972958,21.0.0-2-g45278ab+04719a4bac,21.0.0-2-g5242d73+3ad5d60fb1,21.0.0-2-g7f82c8f+8babb168e8,21.0.0-2-g8f08a60+06509c8b61,21.0.0-2-g8faa9b5+616205b9df,21.0.0-2-ga326454+8babb168e8,21.0.0-2-gde069b7+5e4aea9c2f,21.0.0-2-gecfae73+1d3a86e577,21.0.0-2-gfc62afb+3ad5d60fb1,21.0.0-25-g1d57be3cd+e73869a214,21.0.0-3-g357aad2+ed88757d29,21.0.0-3-g4a4ce7f+3ad5d60fb1,21.0.0-3-g4be5c26+3ad5d60fb1,21.0.0-3-g65f322c+e0b24896a3,21.0.0-3-g7d9da8d+616205b9df,21.0.0-3-ge02ed75+a9c1acf22d,21.0.0-4-g591bb35+a9c1acf22d,21.0.0-4-g65b4814+b60e2d390c,21.0.0-4-gccdca77+0de219a2bc,21.0.0-4-ge8a399c+6c55c39e83,21.0.0-5-gd00fb1e+05fce91b99,21.0.0-6-gc675373+3ad5d60fb1,21.0.0-64-g1122c245+4fb2b8f86e,21.0.0-7-g04766d7+cd19d05db2,21.0.0-7-gdf92d54+04719a4bac,21.0.0-8-g5674e7b+d1bd76f71f,master-gac4afde19b+a9c1acf22d,w.2021.13
LSST Data Management Base Package
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"
31 #include "astshim/detail/utils.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 
67 namespace ast {
68 
69 namespace {
70 
78 extern "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 
85 bool Object::operator==(Object const &rhs) const {
86  auto thisStr = this->show(false);
87  auto rhsStr = rhs.show(false);
88  return rhsStr == thisStr;
89 }
90 
91 std::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 
137 template <typename Class>
138 std::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 
158 void 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 
165 std::string Object::show(bool showComments) const {
167  show(os, showComments);
168  return os.str();
169 }
170 
171 Object::Object(AstObject *object) : _objPtr(object, &detail::annulAstObject) {
172  assertOK();
173  if (!object) {
174  throw std::runtime_error("Null pointer");
175  }
176 }
177 
178 // Explicit instantiations
179 template std::shared_ptr<KeyMap> Object::fromAstObject<KeyMap>(AstObject *, bool);
180 template std::shared_ptr<FitsChan> Object::fromAstObject<FitsChan>(AstObject *, bool);
181 template std::shared_ptr<FrameSet> Object::fromAstObject<FrameSet>(AstObject *, bool);
182 template std::shared_ptr<Frame> Object::fromAstObject<Frame>(AstObject *, bool);
183 template std::shared_ptr<Mapping> Object::fromAstObject<Mapping>(AstObject *, bool);
184 template std::shared_ptr<Object> Object::fromAstObject<Object>(AstObject *, bool);
185 
186 } // namespace ast
table::Key< std::string > name
Definition: Amplifier.cc:116
std::ostream * os
Definition: Schema.cc:746
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
std::shared_ptr< Object > copy() const
Return a deep copy of this object.
Definition: Object.h:109
Object(Object const &object)
Copy constructor: make a deep copy.
Definition: Object.h:64
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)
void annulAstObject(AstObject *object)
A wrapper around astAnnul; intended as a custom deleter for std::unique_ptr.
Definition: utils.h:40
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