40 #include <boost/serialization/nvp.hpp>
41 #include <boost/serialization/shared_ptr.hpp>
43 #include <lsst/daf/base/PropertySet.h>
44 #include "lsst/daf/base/DateTime.h"
45 #include <lsst/pex/exceptions.h>
48 using boost::serialization::make_nvp;
52 namespace persistence {
54 namespace dafBase = lsst::daf::base;
63 template <
class Archive,
typename T>
64 static void serializeItem(Archive& ar, std::string
const& name,
65 dafBase::PropertySet* ps) {
67 if (Archive::is_saving::value) {
68 value = ps->getArray<T>(name);
69 ar & make_nvp(
"value", value);
72 ar & make_nvp(
"value", value);
82 template <
class Archive>
83 static void serializeDateTime(Archive& ar, std::string
const& name,
84 dafBase::PropertySet* ps) {
85 std::vector<dafBase::DateTime> value;
86 std::vector<long long> nsecs;
87 if (Archive::is_saving::value) {
88 value = ps->getArray<dafBase::DateTime>(name);
89 for (std::vector<dafBase::DateTime>::const_iterator i = value.begin();
90 i != value.end(); ++i) {
91 nsecs.push_back(i->nsecs());
93 ar & make_nvp(
"value", nsecs);
96 ar & make_nvp(
"value", nsecs);
97 for (std::vector<long long>::const_iterator i = nsecs.begin();
98 i != nsecs.end(); ++i) {
99 value.push_back(dafBase::DateTime(*i));
101 ps->set(name, value);
113 template <
class Archive>
115 Archive& ar,
unsigned int const version, dafBase::Persistable* persistable) {
116 dafBase::PropertySet* ps =
117 dynamic_cast<dafBase::PropertySet*
>(persistable);
119 throw LSST_EXCEPT(lsst::pex::exceptions::RuntimeError,
"Serializing non-PropertySet");
121 ar & make_nvp(
"base",
122 boost::serialization::base_object<dafBase::Persistable>(*ps));
124 std::vector<std::string> names;
126 if (Archive::is_saving::value) {
127 names = ps->paramNames(
false);
128 nNames = names.size();
130 ar & make_nvp(
"nitems", nNames);
134 for (
size_t i = 0; i < nNames; ++i) {
135 if (Archive::is_saving::value) {
137 std::type_info
const& id(ps->typeOf(name));
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';
157 throw LSST_EXCEPT(lsst::pex::exceptions::RuntimeError,
159 ": Unknown type in PropertySet serialize");
163 ar & make_nvp(
"name", name);
164 ar & make_nvp(
"type", 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;
184 throw LSST_EXCEPT(lsst::pex::exceptions::RuntimeError,
185 std::string(
"Unknown type reading PropertySet") +
186 type +
", name = " + name);