2323
2424#pragma once
2525
26- #include < map >
26+ #include < ored/portfolio/nettingsetdetails.hpp >
2727#include < ored/utilities/xmlutils.hpp>
28+
29+ #include < boost/any.hpp>
30+ #include < boost/none.hpp>
2831#include < boost/tuple/tuple.hpp>
2932#include < boost/tuple/tuple_comparison.hpp>
30- #include < boost/any.hpp>
33+
34+ #include < map>
3135#include < set>
32- #include < ored/portfolio/nettingsetdetails.hpp>
3336
37+ using ore::data::NettingSetDetails;
3438using ore::data::XMLNode;
3539using ore::data::XMLSerializable;
36- using ore::data::NettingSetDetails;
3740using std::map;
3841using std::set;
3942using std::string;
@@ -51,35 +54,37 @@ class Envelope : public XMLSerializable {
5154 Envelope () {}
5255
5356 // ! Constructor with netting set id and portfolio ids, without additional fields
54- Envelope (const string& counterparty, const string& nettingSetId,
55- const set<string>& portfolioIds = set<string>())
56- : counterparty_(counterparty), nettingSetDetails_(NettingSetDetails(nettingSetId)),
57- portfolioIds_ (portfolioIds) {}
57+ Envelope (const string& counterparty, const string& nettingSetId, const set<string>& portfolioIds = set<string>())
58+ : counterparty_(counterparty), nettingSetDetails_(NettingSetDetails(nettingSetId)), portfolioIds_(portfolioIds),
59+ initialized_ (true ) {}
5860
5961 // ! Constructor with netting set details and portfolio ids, without additional fields
6062 Envelope (const string& counterparty, const NettingSetDetails& nettingSetDetails = NettingSetDetails(),
6163 const set<string>& portfolioIds = set<string>())
62- : counterparty_(counterparty), nettingSetDetails_(nettingSetDetails), portfolioIds_(portfolioIds) {}
64+ : counterparty_(counterparty), nettingSetDetails_(nettingSetDetails), portfolioIds_(portfolioIds),
65+ initialized_(true ) {}
6366
6467 // ! Constructor without netting set / portfolio ids, with additional fields
6568 Envelope (const string& counterparty, const map<string, string>& additionalFields)
66- : counterparty_(counterparty), nettingSetDetails_(NettingSetDetails()) {
69+ : counterparty_(counterparty), nettingSetDetails_(NettingSetDetails()), initialized_( true ) {
6770 for (const auto & addField : additionalFields)
6871 additionalFields_[addField.first ] = addField.second ;
6972 }
7073
7174 // ! Constructor with netting set, with additional fields
7275 Envelope (const string& counterparty, const string& nettingSetId, const map<string, string>& additionalFields,
7376 const set<string>& portfolioIds = set<string>())
74- : counterparty_(counterparty), nettingSetDetails_(NettingSetDetails(nettingSetId)), portfolioIds_(portfolioIds) {
77+ : counterparty_(counterparty), nettingSetDetails_(NettingSetDetails(nettingSetId)), portfolioIds_(portfolioIds),
78+ initialized_(true ) {
7579 for (const auto & addField : additionalFields)
7680 additionalFields_[addField.first ] = addField.second ;
7781 }
7882
7983 // ! Constructor with netting set details, with additional fields
8084 Envelope (const string& counterparty, const NettingSetDetails& nettingSetDetails,
8185 const map<string, string>& additionalFields, const set<string>& portfolioIds = set<string>())
82- : counterparty_(counterparty), nettingSetDetails_(nettingSetDetails), portfolioIds_(portfolioIds) {
86+ : counterparty_(counterparty), nettingSetDetails_(nettingSetDetails), portfolioIds_(portfolioIds),
87+ initialized_(true ) {
8388 for (const auto & addField : additionalFields)
8489 additionalFields_[addField.first ] = addField.second ;
8590 }
@@ -96,20 +101,18 @@ class Envelope : public XMLSerializable {
96101 const string& nettingSetId () const { return nettingSetDetails_.nettingSetId (); }
97102 const NettingSetDetails nettingSetDetails () { return nettingSetDetails_; }
98103 const set<string>& portfolioIds () const { return portfolioIds_; }
99- const map<string, string> additionalFields () const {
100- map<string, string> stringAddFields;
101- for (const auto & f : additionalFields_)
102- if (f.second .type () == typeid (string))
103- stringAddFields[f.first ] = boost::any_cast<string>(f.second );
104- return stringAddFields;
105- }
104+ const map<string, string> additionalFields () const ;
106105 const map<string, boost::any>& fullAdditionalFields () const { return additionalFields_; }
106+ string additionalField (const std::string& name, const bool mandatory = true ,
107+ const std::string& defaultValue = std::string()) const ;
108+ boost::any additionalAnyField (const std::string& name, const bool mandatory = true ,
109+ const boost::any& defaultValue = boost::none) const ;
107110 // @}
108111
109112 // ! \name Utility
110113 // @{
111- // ! Check if the envelope has been populated
112- bool empty () const { return counterparty_ == " " ; }
114+ // ! Check if the envelope is initialized
115+ bool initialized () const { return initialized_ ; }
113116 // ! Check if the netting set details have been populated
114117 bool hasNettingSetDetails () const { return !nettingSetDetails_.empty (); }
115118 // @}
@@ -119,6 +122,7 @@ class Envelope : public XMLSerializable {
119122 NettingSetDetails nettingSetDetails_;
120123 set<string> portfolioIds_;
121124 map<string, boost::any> additionalFields_;
125+ bool initialized_ = false ;
122126};
123127
124128} // namespace data
0 commit comments