LSSTApplications  16.0-1-gce273f5+20,16.0-10-gc1446dd+20,16.0-12-g569485f+3,16.0-13-g5e87145+4,16.0-13-g5f20d24,16.0-13-g80874fd+2,16.0-13-gb122224+11,16.0-13-gd9b1b71+20,16.0-14-g08f9460+3,16.0-15-g77ef378+6,16.0-17-g6a7bfb3b+20,16.0-17-ged3ab9d,16.0-18-gdf247dd+1,16.0-2-g0febb12+16,16.0-2-g839ba83+58,16.0-2-g9d5294e+45,16.0-2-gc6e0ed0+4,16.0-23-ge8a9b866+2,16.0-3-g404ea43+12,16.0-3-gbc759ec+18,16.0-3-gcfd6c53+43,16.0-4-g03cf288+34,16.0-4-g13a27c5+20,16.0-4-g5f3a788+15,16.0-4-g8a0f11a+42,16.0-4-ga3eb747+5,16.0-5-g1991253+20,16.0-5-g1e9226d+3,16.0-5-g865efd9+22,16.0-5-gb3f8a4b+52,16.0-5-gd0f1235+9,16.0-51-gb4b4a8566+2,16.0-7-g6043bfc+8,16.0-7-gd2eeba5+2,16.0-7-gde5bd64+2,16.0-8-g0e813a6,16.0-8-g4dec96c+33,16.0-8-gfd407c0+5,16.0-9-g2f60796+2,master-g5768c874b9+4,w.2018.41
LSSTDataManagementBasePackage
PropertySetFormatter.cc
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 
3 /*
4  * LSST Data Management System
5  * Copyright 2008, 2009, 2010 LSST Corporation.
6  *
7  * This product includes software developed by the
8  * LSST Project (http://www.lsst.org/).
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the LSST License Statement and
21  * the GNU General Public License along with this program. If not,
22  * see <http://www.lsstcorp.org/LegalNotices/>.
23  */
24 
25 
37 #include <string>
38 #include <vector>
39 
40 #include <boost/serialization/nvp.hpp>
41 #include <boost/serialization/shared_ptr.hpp>
42 
44 #include "lsst/daf/base/DateTime.h"
45 #include <lsst/pex/exceptions.h>
46 
47 
48 using boost::serialization::make_nvp;
49 
50 namespace lsst {
51 namespace daf {
52 namespace persistence {
53 
54 namespace dafBase = lsst::daf::base;
55 
56 namespace {
57 
63 template <class Archive, typename T>
64 static void serializeItem(Archive& ar, std::string const& name,
66  std::vector<T> value;
67  if (Archive::is_saving::value) {
68  value = ps->getArray<T>(name);
69  ar & make_nvp("value", value);
70  }
71  else {
72  ar & make_nvp("value", value);
73  ps->set(name, value);
74  }
75 }
76 
82 template <class Archive>
83 static void serializeDateTime(Archive& ar, std::string const& name,
87  if (Archive::is_saving::value) {
88  value = ps->getArray<dafBase::DateTime>(name);
90  i != value.end(); ++i) {
91  nsecs.push_back(i->nsecs());
92  }
93  ar & make_nvp("value", nsecs);
94  }
95  else {
96  ar & make_nvp("value", nsecs);
98  i != nsecs.end(); ++i) {
99  value.push_back(dafBase::DateTime(*i));
100  }
101  ps->set(name, value);
102  }
103 }
104 
105 } // anonymous namespace
106 
113 template <class Archive>
115  Archive& ar, unsigned int const version, dafBase::Persistable* persistable) {
117  dynamic_cast<dafBase::PropertySet*>(persistable);
118  if (ps == 0) {
119  throw LSST_EXCEPT(lsst::pex::exceptions::RuntimeError, "Serializing non-PropertySet");
120  }
121  ar & make_nvp("base",
122  boost::serialization::base_object<dafBase::Persistable>(*ps));
123 
125  size_t nNames;
126  if (Archive::is_saving::value) {
127  names = ps->paramNames(false);
128  nNames = names.size();
129  }
130  ar & make_nvp("nitems", nNames);
131 
132  char type;
134  for (size_t i = 0; i < nNames; ++i) {
135  if (Archive::is_saving::value) {
136  name = names[i];
137  std::type_info const& id(ps->typeOf(name));
138 
139  if (id == typeid(bool)) type = 'b';
140  else if (id == typeid(char)) type = 'c';
141  else if (id == typeid(signed char)) type = 'y';
142  else if (id == typeid(unsigned char)) type = 'C';
143  else if (id == typeid(short)) type = 'w';
144  else if (id == typeid(unsigned short)) type = 'W';
145  else if (id == typeid(int)) type = 'i';
146  else if (id == typeid(unsigned int)) type = 'I';
147  else if (id == typeid(long)) type = 'l';
148  else if (id == typeid(unsigned long)) type = 'L';
149  else if (id == typeid(long long)) type = 'x';
150  else if (id == typeid(unsigned long long)) type = 'X';
151  else if (id == typeid(float)) type = 'f';
152  else if (id == typeid(double)) type = 'd';
153  else if (id == typeid(std::string)) type = 's';
154  else if (id == typeid(dafBase::DateTime)) type = 'T';
155  else if (id == typeid(dafBase::Persistable::Ptr)) type = 'p';
156  else {
158  name +
159  ": Unknown type in PropertySet serialize");
160  }
161  }
162 
163  ar & make_nvp("name", name);
164  ar & make_nvp("type", type);
165  switch (type) {
166  case 'b': serializeItem<Archive, bool>(ar, name, ps); break;
167  case 'c': serializeItem<Archive, char>(ar, name, ps); break;
168  case 'y': serializeItem<Archive, signed char>(ar, name, ps); break;
169  case 'C': serializeItem<Archive, unsigned char>(ar, name, ps); break;
170  case 'w': serializeItem<Archive, short>(ar, name, ps); break;
171  case 'W': serializeItem<Archive, unsigned short>(ar, name, ps); break;
172  case 'i': serializeItem<Archive, int>(ar, name, ps); break;
173  case 'I': serializeItem<Archive, unsigned int>(ar, name, ps); break;
174  case 'l': serializeItem<Archive, long>(ar, name, ps); break;
175  case 'L': serializeItem<Archive, unsigned long>(ar, name, ps); break;
176  case 'x': serializeItem<Archive, long long>(ar, name, ps); break;
177  case 'X': serializeItem<Archive, unsigned long long>(ar, name, ps); break;
178  case 'f': serializeItem<Archive, float>(ar, name, ps); break;
179  case 'd': serializeItem<Archive, double>(ar, name, ps); break;
180  case 's': serializeItem<Archive, std::string>(ar, name, ps); break;
181  case 'T': serializeDateTime<Archive>(ar, name, ps); break;
182  case 'p': serializeItem<Archive, dafBase::Persistable::Ptr>(ar, name, ps); break;
183  default:
185  std::string("Unknown type reading PropertySet") +
186  type + ", name = " + name);
187  }
188  }
189 }
190 
191 }}} // namespace lsst::daf::persistence
Class for handling dates/times, including MJD, UTC, and TAI.
Definition: DateTime.h:64
std::vector< T > getArray(std::string const &name) const
Get the vector of values for a property name (possibly hierarchical).
T end(T... args)
std::vector< std::string > paramNames(bool topLevelOnly=true) const
A variant of names that excludes the names of subproperties.
void set(std::string const &name, T const &value)
Replace all values for a property name (possibly hierarchical) with a new scalar value.
STL class.
T push_back(T... args)
A base class for image defects.
Definition: cameraGeom.dox:3
Interface for DateTime class.
int id
Definition: CR.cc:143
T size(T... args)
static void delegateSerialize(Archive &ar, unsigned int const version, dafBase::Persistable *persistable)
Serialize a PropertySet to a Boost archive.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
STL class.
T begin(T... args)
Class for storing generic metadata.
Definition: PropertySet.h:73
std::shared_ptr< Persistable > Ptr
Definition: Persistable.h:77
Base class for all persistable classes.
Definition: Persistable.h:75
Reports errors that are due to events beyond the control of the program.
Definition: Runtime.h:104
std::type_info const & typeOf(std::string const &name) const
Get the type of values for a property name (possibly hierarchical).