lsst.astshim g545b398f03+0a940c1c1f
FrameDict.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_FRAMEDICT_H
23#define ASTSHIM_FRAMEDICT_H
24
25#include <cassert>
26#include <memory>
27#include <set>
28#include <sstream>
29#include <stdexcept>
30#include <unordered_map>
31
32#include "astshim/base.h"
34#include "astshim/Frame.h"
35#include "astshim/FrameSet.h"
36
37namespace ast {
38
67class FrameDict : public FrameSet {
68 friend class Object;
69
70public:
81 explicit FrameDict(Frame const &frame, std::string const &options = "") : FrameSet(frame, options) {
82 _domainIndexDict = _makeNewDict(*this);
83 }
84
97 explicit FrameDict(Frame const &baseFrame, Mapping const &mapping, Frame const &currentFrame,
98 std::string const &options = "")
99 : FrameSet(baseFrame, mapping, currentFrame) {
100 _domainIndexDict = _makeNewDict(*this);
101 }
102
110 explicit FrameDict(FrameSet const &frameSet) : FrameSet(frameSet), _domainIndexDict() {
111 _domainIndexDict = _makeNewDict(*this);
112 }
113
114 virtual ~FrameDict() {}
115
117 FrameDict(FrameDict const &) = default;
118 FrameDict(FrameDict &&) = default;
119 FrameDict &operator=(FrameDict const &) = delete;
121
123 std::shared_ptr<FrameDict> copy() const { return std::static_pointer_cast<FrameDict>(copyPolymorphic()); }
124
131 void addFrame(int iframe, Mapping const &map, Frame const &frame) override;
132
137 void addFrame(std::string const &domain, Mapping const &map, Frame const &frame);
138
142 std::set<std::string> getAllDomains() const;
143
144 using FrameSet::getFrame;
145
151 std::shared_ptr<Frame> getFrame(std::string const &domain, bool copy = true) const {
152 return getFrame(getIndex(domain), copy);
153 }
154
156
162 std::shared_ptr<Mapping> getMapping(int from, std::string const &to) const {
163 return getMapping(from, getIndex(to));
164 }
165
171 std::shared_ptr<Mapping> getMapping(std::string const &from, int to) const {
172 return getMapping(getIndex(from), to);
173 }
174
180 std::shared_ptr<Mapping> getMapping(std::string const &from, std::string const &to) const {
181 return getMapping(getIndex(from), getIndex(to));
182 }
183
189 int getIndex(std::string const &domain) const {
190 auto domainUpper = detail::stringToUpper(domain);
191 auto it = _domainIndexDict.find(domainUpper);
192 if (it == _domainIndexDict.end()) {
193 throw std::out_of_range("No frame found with domain " + domain);
194 }
195 return it->second;
196 }
197
201 bool hasDomain(std::string const &domain) const { return _domainIndexDict.count(domain) > 0; }
202
204
210 void mirrorVariants(std::string const &domain) { mirrorVariants(getIndex(domain)); }
211
213
219 void remapFrame(std::string const &domain, Mapping &map) { remapFrame(getIndex(domain), map); }
220
222 void removeFrame(int iframe) override;
223
229 void removeFrame(std::string const &domain);
230
231 using FrameSet::setBase;
232
238 void setBase(std::string const &domain) { setBase(getIndex(domain)); }
239
241
247 void setCurrent(std::string const &domain) { setCurrent(getIndex(domain)); }
248
254 void setDomain(std::string const &domain) override;
255
256protected:
257 virtual std::shared_ptr<Object> copyPolymorphic() const override {
258 return copyImpl<FrameDict, AstFrameSet>();
259 }
260
273 std::shared_ptr<FrameSet> getFrameSet() const {
274 return std::static_pointer_cast<FrameSet>(copyImpl<FrameSet, AstFrameSet>());
275 }
276
278 explicit FrameDict(AstFrameSet *rawptr);
279
280private:
281 /*
282 Build a new domain:index dict from a FrameSet
283 */
284 static std::unordered_map<std::string, int> _makeNewDict(FrameSet const &frameSet);
285
286 /*
287 Update the internal data using the supplied frameSet, which is swapped with the old data.
288
289 Build a new domain::index dict from frameSet. If successful, replace the current dict
290 and swap frameSet with the old frame set data.
291
292 If any exception is thrown this FrameDict (and the frameSet argument) is unchanged.
293 */
294 void _update(FrameSet &frameSet) {
295 _domainIndexDict = _makeNewDict(frameSet);
296 this->swapRawPointers(frameSet);
297 }
298
299 std::unordered_map<std::string, int> _domainIndexDict; // Dict of frame domain:index
300};
301
302} // namespace ast
303
304#endif
Definition: FrameDict.h:67
void addFrame(int iframe, Mapping const &map, Frame const &frame) override
Definition: FrameDict.cc:32
void mirrorVariants(std::string const &domain)
Definition: FrameDict.h:210
bool hasDomain(std::string const &domain) const
Definition: FrameDict.h:201
std::shared_ptr< Mapping > getMapping(int from, std::string const &to) const
Definition: FrameDict.h:162
std::shared_ptr< FrameDict > copy() const
Return a deep copy of this object.
Definition: FrameDict.h:123
std::shared_ptr< Mapping > getMapping(std::string const &from, int to) const
Definition: FrameDict.h:171
virtual ~FrameDict()
Definition: FrameDict.h:114
void setCurrent(std::string const &domain)
Definition: FrameDict.h:247
std::set< std::string > getAllDomains() const
Definition: FrameDict.cc:45
FrameDict & operator=(FrameDict const &)=delete
virtual std::shared_ptr< Object > copyPolymorphic() const override
Definition: FrameDict.h:257
FrameDict & operator=(FrameDict &&)=default
std::shared_ptr< FrameSet > getFrameSet() const
Definition: FrameDict.h:273
FrameDict(FrameDict &&)=default
FrameDict(Frame const &frame, std::string const &options="")
Definition: FrameDict.h:81
void removeFrame(int iframe) override
Definition: FrameDict.cc:53
std::shared_ptr< Mapping > getMapping(std::string const &from, std::string const &to) const
Definition: FrameDict.h:180
FrameDict(FrameDict const &)=default
Copy constructor: make a deep copy.
void remapFrame(std::string const &domain, Mapping &map)
Definition: FrameDict.h:219
FrameDict(Frame const &baseFrame, Mapping const &mapping, Frame const &currentFrame, std::string const &options="")
Definition: FrameDict.h:97
std::shared_ptr< Frame > getFrame(std::string const &domain, bool copy=true) const
Definition: FrameDict.h:151
FrameDict(FrameSet const &frameSet)
Definition: FrameDict.h:110
int getIndex(std::string const &domain) const
Definition: FrameDict.h:189
void setBase(std::string const &domain)
Definition: FrameDict.h:238
void setDomain(std::string const &domain) override
Definition: FrameDict.cc:61
Definition: Frame.h:157
Definition: FrameSet.h:99
void setBase(int ind)
Definition: FrameSet.h:471
void setCurrent(int ind)
Definition: FrameSet.h:476
void mirrorVariants(int iframe)
Definition: FrameSet.h:367
std::shared_ptr< Mapping > getMapping(int from=BASE, int to=CURRENT) const
Definition: FrameSet.h:304
void remapFrame(int iframe, Mapping &map)
Definition: FrameSet.h:410
std::shared_ptr< Frame > getFrame(int iframe, bool copy=true) const
Definition: FrameSet.h:270
Definition: Mapping.h:59
Definition: Object.h:51
friend class FrameDict
Definition: Object.h:53
std::string stringToUpper(std::string const &str)
Definition: utils.h:108
AST wrapper classes and functions.
Definition: attributes_channel.dox:1