LSSTApplications
20.0.0
LSSTDataManagementBasePackage
stack
1a1d771
Linux64
afw
20.0.0
src
table
AliasMap.cc
Go to the documentation of this file.
1
// -*- lsst-c++ -*-
2
/*
3
* LSST Data Management System
4
* Copyright 2008-2014 LSST Corporation.
5
*
6
* This product includes software developed by the
7
* LSST Project (http://www.lsst.org/).
8
*
9
* This program is free software: you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation, either version 3 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the LSST License Statement and
20
* the GNU General Public License along with this program. If not,
21
* see <http://www.lsstcorp.org/LegalNotices/>.
22
*/
23
24
#include <algorithm>
25
#include <vector>
26
27
#include "
lsst/utils/hashCombine.h
"
28
29
#include "
lsst/pex/exceptions.h
"
30
#include "
lsst/afw/table/AliasMap.h
"
31
#include "
lsst/afw/table/BaseTable.h
"
32
33
namespace
lsst
{
34
namespace
afw
{
35
namespace
table {
36
37
void
AliasMap::_apply(
std::string
&
name
)
const
{
38
// Loop in order to keep replacing as long as we keep finding matches,
39
// but we count how many replacements we've made to avoid an infinite loop
40
// due to a cycle between aliases. That's not the most efficient way to
41
// find cycles, but since a cycle represents a bug in some other code that
42
// should be rare, we don't really care.
43
for
(
std::size_t
count = 0;
count
<= _internal.
size
(); ++
count
) {
44
Iterator
i = _internal.
lower_bound
(
name
);
45
if
(i != _internal.
end
() && i->first.
size
() ==
name
.size() && i->first ==
name
) {
46
// We have a complete match: alias matches the full name we were given
47
name
= i->second;
48
}
else
if
(i != _internal.
begin
()) {
49
// Might still have a partial match: in this case, the iterator
50
// lower_bound returns will be one past the best match, since
51
// smaller strings are considered "less than" longer strings
52
// that they share the same initial charaters with.
53
--i;
54
if
(i->first.size() <
name
.size() &&
name
.compare(0, i->first.size(), i->first) == 0) {
55
name
.replace(0, i->first.size(), i->second);
56
}
else
{
57
return
;
// no match; exit
58
}
59
}
else
{
60
return
;
// no match; exit
61
}
62
}
63
throw
LSST_EXCEPT
(pex::exceptions::RuntimeError,
64
(
boost::format
(
"Cycle detected in schema aliases involving name '%s'"
) %
name
).str());
65
}
66
67
std::string
AliasMap::apply
(
std::string
const
&
name
)
const
{
68
std::string
result
(
name
);
69
_apply(
result
);
70
return
result
;
71
}
72
73
std::string
AliasMap::get
(
std::string
const
&
name
)
const
{
74
Iterator
i = _internal.
find
(
name
);
75
if
(i == _internal.
end
()) {
76
throw
LSST_EXCEPT
(
pex::exceptions::NotFoundError
,
77
(
boost::format
(
"Alias '%s' not found"
) %
name
).str());
78
}
79
return
i->second;
80
}
81
82
void
AliasMap::set
(
std::string
const
& alias,
std::string
const
&
target
) {
83
_internal[alias] =
target
;
84
if
(_table) {
85
_table->
handleAliasChange
(alias);
86
}
87
}
88
89
bool
AliasMap::erase
(
std::string
const
& alias) {
90
bool
result
= _internal.
erase
(alias);
91
if
(_table) {
92
_table->
handleAliasChange
(alias);
93
}
94
return
result
;
95
}
96
97
bool
AliasMap::operator==
(
AliasMap
const
&
other
)
const
{
return
_internal ==
other
._internal; }
98
99
std::size_t
AliasMap::hash_value
() const noexcept {
100
// Warning: this algorithm will be invalid if _internal is replaced by an unsorted map
101
// Completely arbitrary seed
102
std::size_t
result
= 42;
103
for
(
auto
entry : _internal) {
104
result
=
utils::hashCombine
(
result
, entry.first, entry.second);
105
}
106
return
result
;
107
}
108
109
bool
AliasMap::contains
(
AliasMap
const
&
other
)
const
{
110
return
std::includes
(
begin
(),
end
(),
other
.begin(),
other
.end());
111
}
112
}
// namespace table
113
}
// namespace afw
114
}
// namespace lsst
lsst::afw::table::AliasMap::end
Iterator end() const
Return a iterator to one past the end of the map.
Definition:
AliasMap.h:63
lsst::afw::table::AliasMap::hash_value
std::size_t hash_value() const noexcept
Return a hash of this object.
Definition:
AliasMap.cc:99
std::string
STL class.
lsst::afw::table::AliasMap::get
std::string get(std::string const &alias) const
Return the target of the given alias.
Definition:
AliasMap.cc:73
std::includes
T includes(T... args)
std::map::find
T find(T... args)
std::map::size
T size(T... args)
lsst::pex::exceptions::NotFoundError
Reports attempts to access elements using an invalid key.
Definition:
Runtime.h:151
pex.config.history.format
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition:
history.py:174
lsst::afw
Definition:
imageAlgorithm.dox:1
lsst::afw::geom.transform.transformContinued.name
string name
Definition:
transformContinued.py:32
lsst::afw::table::BaseTable::handleAliasChange
virtual void handleAliasChange(std::string const &alias)
Definition:
BaseTable.h:201
hashCombine.h
lsst::afw::table::AliasMap
Mapping class that holds aliases for a Schema.
Definition:
AliasMap.h:36
other
ItemVariant const * other
Definition:
Schema.cc:56
std::map::erase
T erase(T... args)
result
py::object result
Definition:
_schema.cc:429
lsst::afw::table::AliasMap::operator==
bool operator==(AliasMap const &other) const
Equality comparison.
Definition:
AliasMap.cc:97
lsst
A base class for image defects.
Definition:
imageAlgorithm.dox:1
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition:
Exception.h:48
target
Key< Flag > const & target
Definition:
BaseColumnView.cc:20
lsst::afw::table::AliasMap::apply
std::string apply(std::string const &name) const
Apply any aliases that match the given field name and return a de-aliased name.
Definition:
AliasMap.cc:67
lsst::afw::table::AliasMap::begin
Iterator begin() const
Return a iterator to the beginning of the map.
Definition:
AliasMap.h:60
AliasMap.h
lsst::utils::hashCombine
std::size_t hashCombine(std::size_t seed) noexcept
Combine hashes.
Definition:
hashCombine.h:35
std::map::lower_bound
T lower_bound(T... args)
std::map::begin
T begin(T... args)
lsst::afw::table::AliasMap::erase
bool erase(std::string const &alias)
Remove an alias from the schema if it is present.
Definition:
AliasMap.cc:89
std::count
T count(T... args)
BaseTable.h
std::size_t
lsst::afw::table::AliasMap::contains
bool contains(AliasMap const &other) const
Return true if all aliases in this are also in other (with the same targets).
Definition:
AliasMap.cc:109
std::map::end
T end(T... args)
exceptions.h
lsst::afw::table::AliasMap::set
void set(std::string const &alias, std::string const &target)
Add an alias to the schema or replace an existing one.
Definition:
AliasMap.cc:82
lsst::afw::table::AliasMap::Iterator
std::map< std::string, std::string >::const_iterator Iterator
An iterator over alias->target pairs.
Definition:
AliasMap.h:57
Generated on Wed Jun 24 2020 18:10:05 for LSSTApplications by
1.8.18