lsst.afw
g3a5ebb7d8a+28b83bf6a5
Toggle main menu visibility
Loading...
Searching...
No Matches
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 <string>
26
27
#include "
lsst/cpputils/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
auto
table
= _table.lock();
85
if
(
table
) {
86
table
->handleAliasChange(alias);
87
}
88
}
89
90
bool
AliasMap::erase
(
std::string
const
& alias) {
91
bool
result = _internal.erase(alias);
92
auto
table
= _table.lock();
93
if
(
table
) {
94
table
->handleAliasChange(alias);
95
}
96
return
result;
97
}
98
99
bool
AliasMap::operator==
(
AliasMap
const
& other)
const
{
return
_internal == other._internal; }
100
101
std::size_t
AliasMap::hash_value
() const noexcept {
102
// Warning: this algorithm will be invalid if _internal is replaced by an unsorted map
103
// Completely arbitrary seed
104
std::size_t
result = 42;
105
for
(
const
auto
& entry : _internal) {
106
result =
cpputils::hashCombine
(result, entry.first, entry.second);
107
}
108
return
result;
109
}
110
111
bool
AliasMap::contains
(
AliasMap
const
& other)
const
{
112
return
std::includes
(
begin
(),
end
(), other.
begin
(), other.
end
());
113
}
114
}
// namespace table
115
}
// namespace afw
116
}
// namespace lsst
AliasMap.h
BaseTable.h
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
std::string
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:111
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
lsst::afw::table::AliasMap::AliasMap
AliasMap()
Definition
AliasMap.h:41
lsst::afw::table::AliasMap::Iterator
std::map< std::string, std::string >::const_iterator Iterator
An iterator over alias->target pairs.
Definition
AliasMap.h:57
lsst::afw::table::AliasMap::erase
bool erase(std::string const &alias)
Remove an alias from the schema if it is present.
Definition
AliasMap.cc:90
lsst::afw::table::AliasMap::get
std::string get(std::string const &alias) const
Return the target of the given alias.
Definition
AliasMap.cc:73
lsst::afw::table::AliasMap::hash_value
std::size_t hash_value() const noexcept
Return a hash of this object.
Definition
AliasMap.cc:101
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::operator==
bool operator==(AliasMap const &other) const
Equality comparison.
Definition
AliasMap.cc:99
lsst::afw::table::AliasMap::end
Iterator end() const
Return a iterator to one past the end of the map.
Definition
AliasMap.h:63
lsst::pex::exceptions::NotFoundError
std::string::compare
T compare(T... args)
std::count
T count(T... args)
exceptions.h
hashCombine.h
std::includes
T includes(T... args)
lsst::afw::table
Definition
table.dox:3
lsst::afw
Definition
imageAlgorithm.dox:1
lsst::cpputils::hashCombine
std::size_t hashCombine(std::size_t seed) noexcept
lsst
std::string::replace
T replace(T... args)
std::string::size
T size(T... args)
std::size_t
Generated on
for lsst.afw by
1.17.0