Teuchos - Trilinos Tools Package  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Teuchos_XMLParameterListWriter.cpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Teuchos: Common Tools Package
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
43 #include "Teuchos_ParameterEntryXMLConverterDB.hpp"
47 
48 
49 namespace Teuchos{
50 
51 
53 {;}
54 
55 
58  const ParameterList& p,
59  RCP<const DependencySheet> depSheet) const
60 {
61  EntryIDsMap entryIDsMap;
62  ValidatortoIDMap validatorIDsMap;
63  ParameterEntry::ParameterEntryID peIDCounter = 0;
64 
65  //We build an initial map full of validators that are located in the
66  //parameter list. That way we can convert the parameter entries.
67  buildInitialValidatorMap(p, validatorIDsMap);
68 
69  XMLObject toReturn =
70  convertParameterList(p, peIDCounter, entryIDsMap, validatorIDsMap);
71  toReturn.addAttribute(getNameAttributeName(), p.name());
72 
73  if(!depSheet.is_null()){
74  XMLObject deps =
75  convertDependencies(depSheet, entryIDsMap, validatorIDsMap);
76  toReturn.addChild(deps);
77  }
78 
79  //Validators must be done after depencneies because dependencies might add
80  //entries to the validator map. KLN 09/20/2010
81  XMLObject validators = convertValidators(p, validatorIDsMap);
82  toReturn.addChild(validators);
83 
84  return toReturn;
85 }
86 
87 void XMLParameterListWriter::buildInitialValidatorMap(
88  const ParameterList& p,
89  ValidatortoIDMap& validatorIDsMap) const
90 {
91  for (ParameterList::ConstIterator i=p.begin(); i!=p.end(); ++i) {
92  const ParameterEntry& entry = p.entry(i);
93  if(entry.isList()){
94  buildInitialValidatorMap(
95  getValue<ParameterList>(entry),
96  validatorIDsMap);
97  }
98  else if(nonnull(entry.validator())){
99  validatorIDsMap.insert(entry.validator());
100  }
101  }
102 }
103 
104 
105 XMLObject XMLParameterListWriter::convertValidators(
106  const ParameterList& /* p */, ValidatortoIDMap& validatorIDsMap) const
107 {
108  XMLObject validators(getValidatorsTagName());
109  for(
110  ValidatortoIDMap::const_iterator it = validatorIDsMap.begin();
111  it != validatorIDsMap.end();
112  ++it)
113  {
114  validators.addChild(
115  ValidatorXMLConverterDB::convertValidator(it->first, validatorIDsMap));
116  }
117  return validators;
118 }
119 
120 
121 XMLObject XMLParameterListWriter::convertParameterList(
122  const ParameterList& p,
124  EntryIDsMap& entryIDsMap,
125  const ValidatortoIDMap& validatorIDsMap) const
126 {
127  XMLObject rtn(getParameterListTagName());
128 
129  for (ParameterList::ConstIterator i=p.begin(); i!=p.end(); ++i){
130  RCP<const ParameterEntry> entry = p.getEntryRCP(i->first);
131  if(entry->isList()){
132  XMLObject newPL = convertParameterList(
133  getValue<ParameterList>(entry),
134  idCounter,
135  entryIDsMap,
136  validatorIDsMap);
137  newPL.addAttribute(
138  getNameAttributeName(), p.name(i));
139  newPL.addAttribute(
141  entryIDsMap.insert(EntryIDsMap::value_type(entry, idCounter));
142  rtn.addChild(newPL);
143  ++idCounter;
144  }
145  else{
147  entry, p.name(i), idCounter, validatorIDsMap));
148  entryIDsMap.insert(EntryIDsMap::value_type(entry, idCounter));
149  ++idCounter;
150  }
151  }
152  return rtn;
153 }
154 
155 XMLObject
156 XMLParameterListWriter::convertDependencies(
157  RCP<const DependencySheet> depSheet,
158  const EntryIDsMap& entryIDsMap,
159  ValidatortoIDMap& validatorIDsMap) const
160 {
161  XMLObject toReturn(getDependenciesTagName());
162  toReturn.addAttribute(
164  depSheet->getName()
165  );
166 
167  for(
168  DependencySheet::DepSet::const_iterator it = depSheet->depBegin();
169  it != depSheet->depEnd();
170  ++it)
171  {
173  *it, entryIDsMap, validatorIDsMap));
174  }
175  return toReturn;
176 }
177 
178 
179 } // namespace Teuchos
180 
const std::string & name() const
The name of this ParameterList.
C++ Standard Library compatable filtered iterator.
XMLObject toXML(const ParameterList &p, RCP< const DependencySheet > depSheet=null) const
ConstIterator end() const
An iterator pointing beyond the last entry.
A database for DependencyXMLConverters.
RCP< const ParameterEntryValidator > validator() const
Return the (optional) validator object.
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
This object is held as the &quot;value&quot; in the Teuchos::ParameterList std::map.
void addChild(const XMLObject &child)
Add a child node to the node.
ValidatorMap::const_iterator const_iterator
static const std::string & getValidatorsTagName()
static XMLObject convertValidator(RCP< const ParameterEntryValidator > validator, const ValidatortoIDMap &validatorIDsMap, bool assignedID=true)
Given a validator converts the validator to XML.
Representation of an XML data tree. XMLObject is a ref-counted handle to a XMLObjectImplem object...
static const std::string & getDependenciesTagName()
A database for ValidatorXMLConverters.
Writes a ParameterList to an XML object.
params_t::ConstIterator ConstIterator
Parameter container const iterator typedef.
std::map< RCP< const ParameterEntry >, ParameterEntry::ParameterEntryID, RCPConstComp > EntryIDsMap
A class for mapping validators to integers.
void insert(RCP< const ParameterEntryValidator > toInsert)
inserts an IDValidatorPair into the map.
ConstIterator begin() const
An iterator pointing to the first entry.
void addAttribute(const std::string &name, T value)
Lookup whether or not Doubles are allowed.
bool isList() const
Return whether or not the value itself is a list.
A list of parameters of arbitrary type.
const ParameterEntry & entry(ConstIterator i) const
Access to ParameterEntry (i.e., returns i-&gt;second)
static XMLObject convertEntry(RCP< const ParameterEntry > entry, const std::string &name, const ParameterEntry::ParameterEntryID &id, const ValidatortoIDMap &validatorIDsMap)
Converts the given ParameterEntry to XML.
A collection of Exceptions that can be potentially thrown when converting a ParameterList to and from...
Smart reference counting pointer class for automatic garbage collection.
static const std::string & getParameterListTagName()
static XMLObject convertDependency(RCP< const Dependency > dependency, const XMLParameterListWriter::EntryIDsMap &entryIDsMap, ValidatortoIDMap &validatorIDsMap)
Given a dependency converts the dependency to XML.
static const std::string & getNameAttributeName()
static const std::string & getNameAttributeName()
When serializing to XML, this string should be used as the name of the name attribute.
bool is_null() const
Returns true if the underlying pointer is null.