1 /* Copyright (C) 2006-2008 Joris Mooij [j dot mooij at science dot ru dot nl]
2 Radboud University Nijmegen, The Netherlands
4 This file is part of libDAI.
6 libDAI is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 libDAI is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with libDAI; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 #include <dai/properties.h>
24 #include <dai/alldai.h>
30 /// Sends a single Property object to an output stream
31 std::ostream
& operator<< (std::ostream
& os
, const Property
& p
) {
33 if( p
.second
.type() == typeid(size_t) )
34 os
<< boost::any_cast
<size_t>(p
.second
);
35 else if( p
.second
.type() == typeid(std::string
) )
36 os
<< boost::any_cast
<std::string
>(p
.second
);
37 else if( p
.second
.type() == typeid(double) )
38 os
<< boost::any_cast
<double>(p
.second
);
39 else if( p
.second
.type() == typeid(bool) )
40 os
<< boost::any_cast
<bool>(p
.second
);
41 else if( p
.second
.type() == typeid(PropertySet
) )
42 os
<< boost::any_cast
<PropertySet
>(p
.second
);
44 else if( p
.second
.type() == typeid(BP::Properties::UpdateType
) )
45 os
<< boost::any_cast
<BP::Properties::UpdateType
>(p
.second
);
48 else if( p
.second
.type() == typeid(HAK::Properties::ClustersType
) )
49 os
<< boost::any_cast
<HAK::Properties::ClustersType
>(p
.second
);
52 else if( p
.second
.type() == typeid(JTree::Properties::UpdateType
) )
53 os
<< boost::any_cast
<JTree::Properties::UpdateType
>(p
.second
);
56 else if( p
.second
.type() == typeid(MR::Properties::UpdateType
) )
57 os
<< boost::any_cast
<MR::Properties::UpdateType
>(p
.second
);
58 else if( p
.second
.type() == typeid(MR::Properties::InitType
) )
59 os
<< boost::any_cast
<MR::Properties::InitType
>(p
.second
);
62 else if( p
.second
.type() == typeid(TreeEP::Properties::TypeType
) )
63 os
<< boost::any_cast
<TreeEP::Properties::TypeType
>(p
.second
);
66 else if( p
.second
.type() == typeid(LC::Properties::CavityType
) )
67 os
<< boost::any_cast
<LC::Properties::CavityType
>(p
.second
);
68 else if( p
.second
.type() == typeid(LC::Properties::UpdateType
) )
69 os
<< boost::any_cast
<LC::Properties::UpdateType
>(p
.second
);
72 throw "Unknown property type";
77 /// Sends a PropertySet object to an output stream
78 std::ostream
& operator<< (std::ostream
& os
, const PropertySet
& ps
) {
80 for( PropertySet::const_iterator p
= ps
.begin(); p
!= ps
.end(); p
++ ) {
90 /// Reads a PropertySet object from an input stream, storing values as strings
91 std::istream
& operator >> (std::istream
& is
, PropertySet
& ps
) {
97 // Check whether s is of the form "[.*]"
98 if( (s
.length() < 2) || (s
.at(0) != '[') || (s
.at(s
.length()-1)) != ']' )
99 throw "Malformed property";
101 size_t N
= s
.length() - 1;
102 for( size_t token_start
= 1; token_start
< N
; ) {
105 // scan until '=' is found
106 for( token_end
= token_start
+ 1; token_end
< N
; token_end
++ )
107 if( s
[token_end
] == '=' )
110 throw "Malformed property key";
112 std::string key
= s
.substr(token_start
, token_end
- token_start
);
114 token_start
= token_end
+ 1;
115 // scan until matching ',' is found
117 for( token_end
= token_start
; token_end
< N
; token_end
++ ) {
118 if( s
[token_end
] == '[' )
120 else if( s
[token_end
] == ']' )
122 else if( (s
[token_end
] == ',') && (level
== 0) )
126 throw "Malformed property value";
128 std::string value
= s
.substr(token_start
, token_end
- token_start
);
130 // store the key,value pair
133 // go on with the next one
134 token_start
= token_end
+ 1;
141 } // end of namespace dai