version  0.0.1
Defines the C++ API for MsPASS
Loading...
Searching...
No Matches
Public Member Functions | List of all members
mspass::utility::MetadataDefinitions Class Reference

Define properties of Metadata known to mspass. More...

#include <MetadataDefinitions.h>

Public Member Functions

 MetadataDefinitions ()
 
 MetadataDefinitions (const std::string mdname)
 Construct from a namespace title.
 
 MetadataDefinitions (const std::string mdname, const mspass::utility::MDDefFormat form)
 Construct from a file with variable formats.
 
 MetadataDefinitions (const MetadataDefinitions &parent)
 
bool is_defined (const std::string key) const noexcept
 
std::string concept (const std::string key) const
 
mspass::utility::MDtype type (const std::string key) const
 
std::list< std::string > keys () const
 
void add (const std::string key, const std::string concept_, const MDtype mdt)
 
bool has_alias (const std::string key) const
 Methods to handle aliases.
 
bool is_alias (const std::string key) const
 Ask if a key is a registered alias.
 
std::list< std::string > aliases (const std::string key) const
 
std::pair< std::string, mspass::utility::MDtype > unique_name (const std::string aliasname) const
 
void add_alias (const std::string key, const std::string aliasname)
 
bool writeable (const std::string key) const
 
bool readonly (const std::string key) const
 
void set_readonly (const std::string key)
 Lock a parameter to assure it will not be saved.
 
void set_writeable (const std::string key)
 Force a key:value pair to be writeable.
 
bool is_normalized (const std::string key) const
 Test if a key:value pair is set as normalized.
 
std::string unique_id_key (const std::string key) const
 Returns a unique identifier for a normalized attribute.
 
std::string collection (const std::string key) const
 
std::pair< std::string, std::string > normalize_data (const std::string key) const
 Special method for efficiency.
 
std::list< std::string > apply_aliases (mspass::utility::Metadata &d, const std::list< std::string > aliaslist)
 Apply a set of aliases to data.
 
void clear_aliases (mspass::utility::Metadata &d)
 Restore any aliases to unique names.
 
MetadataDefinitionsoperator= (const MetadataDefinitions &other)
 
MetadataDefinitionsoperator+= (const MetadataDefinitions &other)
 Accumulate additional definitions.
 

Detailed Description

Define properties of Metadata known to mspass.

The metadata system in mspass was designed to be infinitely flexible. However, to be maintainable and provide some stability we need a method to define the full properties of the keys that define attributes known to the system. This object does that through wwhat I hope is a simple interface. The expectation is the main use of this class is in python code that will read and write to mongo. Mongo is type sensitive but python tries hard to by loosy goosy about types. The main use is then expected that all gets and puts to Metadata will be preceded by calls to the type method here. Based on the return the right get or put method can be called.

The overhead of creating this thing is not small. It will likely be recommended as an initialization step for most mspass processing scripts. Ultimately it perhaps should have a database constructor, but initially we will build it only from data file.

Constructor & Destructor Documentation

◆ MetadataDefinitions() [1/4]

mspass::utility::MetadataDefinitions::MetadataDefinitions ( )

Default constructor. Loads default schema name of mspass.

44 {
45 try {
46 string datadir = mspass::utility::data_directory();
47 string path;
48 path = datadir + "/yaml/" + DefaultSchemaName + ".yaml";
49 MetadataDefinitions tmp(path, MDDefFormat::YAML);
50 *this = tmp;
51 } catch (...) {
52 throw;
53 };
54}
MetadataDefinitions()
Definition MetadataDefinitions.cc:44

◆ MetadataDefinitions() [2/4]

mspass::utility::MetadataDefinitions::MetadataDefinitions ( const std::string  mdname)

Construct from a namespace title.

How this is to be implemented is to be determined, but for many uses a simple one line description of the name space for attributes would be a helpful api. At this time it is not implemented and attempts to use this will throw an exception.

14 {
15 try {
16 /* silent try to recover if the user adds .yaml to mdname*/
17 std::size_t ipos; // size_t seems essential here for this to work -weird
18 string name_to_use;
19 ipos = mdname.find(".yaml");
20 if (ipos == std::string::npos) {
21 name_to_use = mdname;
22 }
23 /* We throw an exception if the name is a path with / characters*/
24 else if (mdname.find("/") != std::string::npos) {
25 throw MsPASSError("MetadataDefinitions: name passed seems to be a full "
26 "path name that is not allowed\nReceived this: " +
27 mdname,
28 ErrorSeverity::Invalid);
29 } else {
30 name_to_use.assign(mdname, 0, ipos);
31 }
32 string datadir = mspass::utility::data_directory();
33 string path;
34 path = datadir + "/yaml/" + name_to_use + ".yaml";
35 MetadataDefinitions tmp(path, MDDefFormat::YAML);
36 *this = tmp;
37 } catch (...) {
38 throw;
39 };
40}

◆ MetadataDefinitions() [3/4]

mspass::utility::MetadataDefinitions::MetadataDefinitions ( const std::string  mdname,
const mspass::utility::MDDefFormat  form 
)

Construct from a file with variable formats.

This constructor reads from a file to build the object. The API allows multiple formats through the enum class.

Parameters
mdnameis the file to read
formdefines the format (limited by MDDefFormat definitions)

◆ MetadataDefinitions() [4/4]

mspass::utility::MetadataDefinitions::MetadataDefinitions ( const MetadataDefinitions parent)

Standard copy constructor.

75 : tmap(parent.tmap), cmap(parent.cmap), aliasmap(parent.aliasmap),
76 alias_xref(parent.alias_xref), roset(parent.roset),
77 unique_id_data(parent.unique_id_data) {}

Member Function Documentation

◆ add()

void mspass::utility::MetadataDefinitions::add ( const std::string  key,
const std::string  concept_,
const MDtype  mdt 
)

Basic putter.

Use to add a new entry to the definitions. Note that because this is implemented with C++ map containers if data for the defined key is already present it will be silently replaced.

Parameters
keyis the key for indexing this attribute
concept_is brief description saved as the concept for this key
typedefines the type to be defined for this key.
123 {
124 cmap[key] = concept_;
125 tmap[key] = mdt;
126}

◆ add_alias()

void mspass::utility::MetadataDefinitions::add_alias ( const std::string  key,
const std::string  aliasname 
)

Add an alias for key.

Parameters
keyis the main key for which an alias is to be defined
aliasnameis the the alternative name to define.
153 {
154 /* We could use operator[] but this is more bombproof if not as clear */
155 aliasmap.insert(std::pair<string, string>(key, aliasname));
156 alias_xref.insert(std::pair<string, string>(aliasname, key));
157}

◆ aliases()

list< std::string > mspass::utility::MetadataDefinitions::aliases ( const std::string  key) const
135 {
136 list<std::string> result;
137 multimap<string, string>::const_iterator aptr;
138 aptr = aliasmap.find(key);
139 if (aptr == aliasmap.end())
140 return result; // return an empty list when not found
141 std::pair<multimap<string, string>::const_iterator,
142 multimap<string, string>::const_iterator>
143 rng;
144 rng = aliasmap.equal_range(key);
145 /* Obscure iterator loop over return of equal_range. See multimap
146 * documentation*/
147 for (aptr = rng.first; aptr != rng.second; ++aptr) {
148 result.push_back(aptr->second);
149 }
150 return result;
151}

◆ apply_aliases()

std::list< string > mspass::utility::MetadataDefinitions::apply_aliases ( mspass::utility::Metadata d,
const std::list< std::string >  aliaslist 
)

Apply a set of aliases to data.

This method should be called in processing workflows to apply a series of defined aliases to data. The method uses the is_alias method to verify if an alias name is valid. It will not change the key if the name is not defined as a valid alias. The keys that fail that test will be posted to the std::list that is returned. Callers should test the size of the return and if it is not empty take appropriate action.

Parameters
dis the data to alter (usually actually a TimeSeries of Seismogram)
aliaslistis a list of aliases names to apply.
Returns
std::list of srings of failed changes. Callers should test the size of this return and take action if needed.
479 {
480 list<string> failures;
481 list<string>::const_iterator aptr;
482 std::pair<string, MDtype> nmpair;
483 for (aptr = aliaslist.begin(); aptr != aliaslist.end(); ++aptr) {
484 if (this->is_alias(*aptr)) {
485 nmpair = this->unique_name(*aptr);
486 string ukey = nmpair.first;
487 /* Silently skip any aliases not defined. That assures that if the
488 name had already been changed to this alias it will be prserved. */
489 if (d.is_defined(ukey)) {
490 d.change_key(ukey, *aptr);
491 }
492 } else {
493 failures.push_back(*aptr);
494 }
495 }
496 return failures;
497}
bool is_alias(const std::string key) const
Ask if a key is a registered alias.
Definition MetadataDefinitions.cc:158
std::pair< std::string, mspass::utility::MDtype > unique_name(const std::string aliasname) const
Definition MetadataDefinitions.cc:168
bool is_defined(const std::string key) const noexcept
Definition Metadata.cc:63
void change_key(const std::string oldkey, const std::string newkey)
Change the keyword to access an attribute.
Definition Metadata.cc:281

References mspass::utility::Metadata::change_key(), is_alias(), mspass::utility::Metadata::is_defined(), and unique_name().

◆ clear_aliases()

void mspass::utility::MetadataDefinitions::clear_aliases ( mspass::utility::Metadata d)

Restore any aliases to unique names.

Aliases are needed to support legacy packages, but can cause downstream problem if left intact. This method clears any aliases and sets them to the unique_name defined by this object.

Parameters
dis data to be altered. Normally a Seismogram of TimeSeries but can be a raw Metadata object.
Returns
ErrorLogger containing any problems encountered. This function always returns and treats any problems as nonfatal errors and posts a log entry into this returned object. Caller should test the size of the return and handle or ignore errors as appropriate.
498 {
499 std::set<string> keys;
500 keys = d.keys();
501 std::set<string>::iterator kptr;
502 std::pair<string, MDtype> nmpair;
503 for (kptr = keys.begin(); kptr != keys.end(); ++kptr) {
504 if (this->is_alias(*kptr)) {
505 nmpair = this->unique_name(*kptr);
506 string ukey = nmpair.first;
507 d.change_key(*kptr, ukey);
508 }
509 }
510}
std::set< std::string > keys() const noexcept
Definition Metadata.cc:116

References mspass::utility::Metadata::change_key(), is_alias(), mspass::utility::Metadata::keys(), and unique_name().

◆ collection()

string mspass::utility::MetadataDefinitions::collection ( const std::string  key) const

\Brief return the master collection (table) for a key used as a unique id.

Support for normalized Metadata requires static tables (collection in MongoDB) that contain the data using normalization. In seismic data type examples are receiver location tables, receiver response tables, and source location data. This method should nearly always be paired with a call to unique_id_key. The idea is to first ask for the unique_id_key and then ask what collection (table) contains the key returned by unique_id_key. This provides a fast and convenient lookup for normalized data.

Parameters
keyis the normally the return from unique_id_key
Returns
string defining the collection(table) the key can be used for locating the unique tuple/document required to access related Metadata. String will be empty if the search fails.
324 {
325 map<string, tuple<string, string>>::const_iterator uidptr;
326 uidptr = unique_id_data.find(key);
327 if (uidptr == unique_id_data.end()) {
328 return (string(""));
329 } else {
330 return (get<0>(uidptr->second));
331 }
332}

◆ concept()

std::string mspass::utility::MetadataDefinitions::concept ( const std::string  key) const

Return a description of the concept this attribute defines.

Parameters
keyis the name that defines the attribute of interest
Returns
a string with a terse description of the concept this attribute defines.
96 {
97 const string base_error("MetadataDefinitions::concept: ");
98 map<string, string>::const_iterator cptr;
99 cptr = cmap.find(key);
100 if (cptr == cmap.end()) {
101 stringstream ss;
102 ss << base_error << "no match for key=" << key << " found" << endl;
103 throw MsPASSError(ss.str(), ErrorSeverity::Invalid);
104 }
105 return cptr->second;
106}

◆ has_alias()

bool mspass::utility::MetadataDefinitions::has_alias ( const std::string  key) const

Methods to handle aliases.

Sometimes it is helpful to have alias keys to define a common concept. For instance, if an attribute is loaded from a ralational db one might want to use alias names of the form table.attribute as an alias to attribute. has_alias should be called first to establish if a name has an alias. To get a list of aliases call the aliases method.

127 {
128 multimap<string, string>::const_iterator aptr;
129 aptr = aliasmap.find(key);
130 if (aptr == aliasmap.end())
131 return false;
132 else
133 return true;
134}

◆ is_alias()

bool mspass::utility::MetadataDefinitions::is_alias ( const std::string  key) const

Ask if a key is a registered alias.

This asks the inverse question to has_alias. That is, it yields true of the key is registered as a valid alias. It returns false if the key is not defined at all. Note it will yield false if the key is a registered unique name and not an alias.

158 {
159 map<string, string>::const_iterator mptr;
160 mptr = alias_xref.find(key);
161 if (mptr == alias_xref.end())
162 return false;
163 else
164 return true;
165}

◆ is_defined()

bool mspass::utility::MetadataDefinitions::is_defined ( const std::string  key) const
noexcept

Test if a key is defined either as a unique key or an alias

78 {
79 /* test type map because concept can be empty for a key */
80 map<string, MDtype>::const_iterator tptr;
81 tptr = tmap.find(key);
82 if (tptr != tmap.end()) {
83 return true;
84 } else {
85 pair<string, MDtype> unr;
86 /* A bit weird to catch an exception as a way to test for a false, but
87 the way the api currently is defined requires this. */
88 try {
89 unr = this->unique_name(key);
90 return true;
91 } catch (MsPASSError &mderr) {
92 return false;
93 }
94 }
95}

◆ is_normalized()

bool mspass::utility::MetadataDefinitions::is_normalized ( const std::string  key) const

Test if a key:value pair is set as normalized.

In MongoDB a normalized attribute is one that has a master copy in one and only one place. This method returns true if an attribute is marked normalized and false otherwise (It will also return false for any key that is undefined.).

306 {
307 if (unique_id_data.find(key) != unique_id_data.end())
308 return true;
309 else
310 return false;
311}

◆ keys()

std::list< std::string > mspass::utility::MetadataDefinitions::keys ( ) const
190 {
191 /* assume tmap and cmap have the same keys*/
192 std::list<std::string> result;
193 map<string, mspass::utility::MDtype>::const_iterator tptr;
194 for (tptr = tmap.cbegin(); tptr != tmap.cend(); ++tptr) {
195 result.push_back(tptr->first);
196 }
197 return result;
198}

◆ normalize_data()

std::pair< std::string, std::string > mspass::utility::MetadataDefinitions::normalize_data ( const std::string  key) const

Special method for efficiency.

For mspass using mongodb normalization for all currently supported Metadata can be reduced to a collection(table)-attribute name pair. The unique_id_key and collection methods can be called to obtained this information, but doing so requires a purely duplicate (internal map container) search. This convenience method is best used with MongoDB for efficiency.

Parameters
keyis the flat namespace key for which normalizing data is needed
Returns
an std::pair with of strings with first=collection and second=attribute name.
334 {
335 map<string, tuple<string, string>>::const_iterator uidptr;
336 uidptr = unique_id_data.find(key);
337 if (uidptr == unique_id_data.end()) {
338 throw MsPASSError("MetadataDefinitions::normalize_data: key=" + key +
339 " has no normalization data");
340 } else {
341 pair<string, string> result;
342 result.first = get<0>(uidptr->second);
343 result.second = get<1>(uidptr->second);
344 return result;
345 }
346}

◆ operator+=()

MetadataDefinitions & mspass::utility::MetadataDefinitions::operator+= ( const MetadataDefinitions other)

Accumulate additional definitions.

Appends data in other to current. The behavior or this operator is not really a pure + operation as one would think of it as with arithmetic. Because the model is that we are defining the properties of unique keys handling the case where other has a duplicate key to the instance of the left hand side is ambiguous. We choose the more intuitive case where the right hand side overrides the left. i.e. if other has duplicate data for a key the right hand side version replaces the left. There are two exceptions. Aliases are multivalued so they accumulate. i.e. this mechanism can be used to do little more than add an alias if the others data are the same. The second case is more trivial and rarely of importance. That is, other can have empty concept data for a key and it will be silently set empty. The reason is concept is purely for human readers and is not expected to ever be used by processors.

212 {
213 if (this == &other)
214 return *this;
215 list<string> kvals = other.keys();
216 list<string>::iterator kptr;
217 for (kptr = kvals.begin(); kptr != kvals.end(); ++kptr) {
218 MDtype mdt = other.type(*kptr);
219 /* Note this will silently overwrite previous if the key was already
220 * present*/
221 this->tmap[*kptr] = mdt;
222 try {
223 string cother = other.concept(*kptr);
224 this->cmap[*kptr] = cother;
225 } catch (MsPASSError &merr) {
226 // Assume the only error here comes from concept methode failing
227 cerr << "MetadataDefinitions operator+= (Warning): concept description "
228 "is missing for key="
229 << *kptr << endl
230 << "Error will be ignored" << endl;
231 }
232 /* The alias_xref is a multimap so we just append other data - no such thing
233 * as duplicates*/
234 map<string, string>::const_iterator aptr;
235 for (aptr = other.alias_xref.begin(); aptr != other.alias_xref.end();
236 ++aptr) {
237 this->alias_xref.insert(*aptr);
238 }
239 /* These behave like the type map above - we silently replace any entry
240 that was present before. i.e. other overrides */
241 set<string>::const_iterator sptr;
242 for (sptr = other.roset.begin(); sptr != roset.end(); ++sptr) {
243 this->roset.insert(*sptr);
244 }
245 map<string, tuple<string, string>>::const_iterator uptr;
246 for (uptr = other.unique_id_data.begin();
247 uptr != other.unique_id_data.end(); ++uptr) {
248 this->unique_id_data.insert(*uptr);
249 }
250 }
251 return *this;
252}

References concept(), and type().

◆ operator=()

MetadataDefinitions & mspass::utility::MetadataDefinitions::operator= ( const MetadataDefinitions other)

Standard assignment operator.

200 {
201 if (this != &parent) {
202 tmap = parent.tmap;
203 cmap = parent.cmap;
204 aliasmap = parent.aliasmap;
205 alias_xref = parent.alias_xref;
206 roset = parent.roset;
207 unique_id_data = parent.unique_id_data;
208 }
209 return *this;
210}

◆ readonly()

bool mspass::utility::MetadataDefinitions::readonly ( const std::string  key) const

Check if a key:value pair is marked readonly. Inverted logic of similar writeable method.

Parameters
keyis key used to access the parameter to be tested.
Returns
true of the data linked to this keys IS marked readonly. (if the key is undefined this method silently returns true)
289 {
290 return (!(this->writeable(key)));
291}
bool writeable(const std::string key) const
Definition MetadataDefinitions.cc:257

References writeable().

◆ set_readonly()

void mspass::utility::MetadataDefinitions::set_readonly ( const std::string  key)

Lock a parameter to assure it will not be saved.

Parameters can be defined readonly. That is a standard feature of this class, but is normally expected to be set on construction of the object. There are sometimes reason to lock out a parameter to keep it from being saved in output. This method allows this. On the other hand, use this feature only if you fully understand the downstream implications or you may experience unintended consequences.

Parameters
keyis the key for the attribute with properties to be redefined.
292 {
293 /* Silently return if key is already set as readonly */
294 if (roset.find(key) == roset.end()) {
295 roset.insert(key);
296 }
297}

◆ set_writeable()

void mspass::utility::MetadataDefinitions::set_writeable ( const std::string  key)

Force a key:value pair to be writeable.

Normally some parameters are marked readonly on construction to avoid corrupting the database with inconsistent data defined with a common key. (e.g. sta) This method overrides such definitions for any key so marked. It does nothing except a pointles search if the key hasn't been marked readonly previously. This method should be used with caution as it could have unintended side effects.

Parameters
keyis key for the attribute to be redefined.
298 {
299 set<string>::const_iterator roptr;
300 roptr = roset.find(key);
301 /* Here we silently do nothing if the key is not in roset */
302 if (roptr != roset.end()) {
303 roset.erase(roptr);
304 }
305}

◆ type()

mspass::utility::MDtype mspass::utility::MetadataDefinitions::type ( const std::string  key) const

Get the type of an attribute.

Parameters
keyis the name that defines the attribute of interest
Returns
MDtype enum that can be used to establish the proper type.
108 {
109 const string base_error("MetadataDefinitions::type: ");
110 map<std::string, mspass::utility::MDtype>::const_iterator tptr;
111 if (this->is_alias(key))
112 return this->unique_name(key).second;
113 tptr = tmap.find(key);
114 if (tptr == tmap.end()) {
115 stringstream ss;
116 ss << base_error << "no match for key=" << key << " found" << endl;
117 throw MsPASSError(ss.str(), ErrorSeverity::Invalid);
118 }
119 return tptr->second;
120}

References is_alias(), and unique_name().

◆ unique_id_key()

string mspass::utility::MetadataDefinitions::unique_id_key ( const std::string  key) const

Returns a unique identifier for a normalized attribute.

In MongoDB a normalized attribute is one that has a master copy in one and only one place. This method returns a unique identifier, which defines a key that can be used to access the attribute used as an index to identify a unique location for an otherwise potentially ambiguous identifier (e.g. sta can be used in may contexts). The type of attribute to which the returned key is linked is expected to normally be acquired by am immediate call to the type method of this class using the return key. It is the callers responsibility to handle errors if the request for the type information fails. Note for MongoDB the most common (and recommended) type for the unique id is an Object_ID. The design of the API, however, should not preclude some other index or an index oriented toward a relational database. (e.g. chanid is an integer key with a one-to-one relation for channel data in the CSS3.0 schema.)

Some unique id specifications require a table/collection qualifier. See related collection method that is designed to handle that.

This method should normally be used only on read operations to select the correct entry for what could otherwise be a potentially ambiguous key.

Parameters
keyis the flat namespace key for which normalizing data is needed
Returns
name for unique id for requested key. Returns an empty string if the key is not defined as normalized. In multiple calls it is more efficient to test for a null return and handle such entries inline instead of a double search required if preceded by is_normalized.
314 {
315 map<string, tuple<string, string>>::const_iterator uidptr;
316 uidptr = unique_id_data.find(key);
317
318 if (uidptr != unique_id_data.end()) {
319 return (get<1>(uidptr->second));
320 } else {
321 return (string(""));
322 }
323}

◆ unique_name()

std::pair< std::string, mspass::utility::MDtype > mspass::utility::MetadataDefinitions::unique_name ( const std::string  aliasname) const

Get definitive name for an alias.

This method is used to ask the opposite question as aliases. The aliases method returns all acceptable alternatives to a definitive name defined as the key to get said list. This method asks what definitive key should be used to fetch an attribute and what it's type is. It does this by returning an std::pair with first being the key and second the type.

Parameters
aliasnameis the name of the alias for which we want the definitive key
Returns
std::pair with the definitive key as the first of the pair and the type in the second field.
168 {
169 const string base_error("MetadataDefinitions::unique_name: ");
170 map<std::string, std::string>::const_iterator aptr;
171 aptr = alias_xref.find(aliasname);
172 if (aptr == alias_xref.end()) {
173 throw MsPASSError(base_error + "alias name=" + aliasname +
174 " is not defined",
175 ErrorSeverity::Invalid);
176 } else {
177 /* We do not assume the key returned from alias_xref resolves. Small
178 cost for a stability gain*/
179 string kname = aptr->second;
180 map<std::string, MDtype>::const_iterator tptr;
181 tptr = tmap.find(kname);
182 if (tptr == tmap.end())
183 throw MsPASSError(base_error + "alias name=" + aliasname +
184 " has no matching entry in alias tables\n" +
185 "SETUP ERROR - FIX CONFIGURATION FILES",
186 ErrorSeverity::Fatal);
187 return (pair<std::string, mspass::utility::MDtype>(kname, tptr->second));
188 }
189}

◆ writeable()

bool mspass::utility::MetadataDefinitions::writeable ( const std::string  key) const

Check if a key:value pair is mutable(writeable). Inverted logic from similar readonly method.

Parameters
keyis key used to access the parameter to be tested.
Returns
true if the data linked to this not not marked readonly. (if the key is undefined a false is silently returned)
257 {
258 set<string>::const_iterator roptr;
259 roptr = roset.find(key);
260 if (roptr == roset.end())
261 return true;
262 else if (this->is_alias(key)) {
263 /* roset only contains unique key entries. This checks any possible
264 aliases. */
265 pair<string, MDtype> kp;
266 /* unique_name method returns an exception if the key is not defined.
267 We avoid that and silently return false if that happens, although
268 that situation will likely create downstream problems. */
269 try {
270 kp = this->unique_name(key);
271 } catch (MsPASSError &mderr) {
272 cerr << "MetadataDefinitions::writeable method (WARNING): Requested key "
273 << key << " is undefined and is not a registered alias" << endl
274 << "This may cause downstream problems" << endl;
275 return false;
276 }
277 roptr = roset.find(kp.first);
278 if (roptr == roset.end())
279 return true;
280 else
281 return false;
282 } else {
283 /* A bit confusing layout here. We land here if the
284 * key was marked read only and was not an alias. */
285 return false;
286 }
287}

References is_alias(), and unique_name().


The documentation for this class was generated from the following files: