lsst.afw
g3a5ebb7d8a+28b83bf6a5
Toggle main menu visibility
Loading...
Searching...
No Matches
src
table
IdFactory.cc
Go to the documentation of this file.
1
#include <memory>
2
#include "boost/format.hpp"
3
4
#include "
lsst/pex/exceptions.h
"
5
#include "
lsst/afw/table/IdFactory.h
"
6
7
namespace
lsst
{
8
namespace
afw
{
9
namespace
table
{
10
11
namespace
{
12
13
class
SimpleIdFactory :
public
IdFactory
{
14
public
:
15
RecordId
operator()()
override
{
return
++_current; }
16
17
void
notify(
RecordId
id
)
override
{ _current = id; }
18
19
std::shared_ptr<IdFactory>
clone
()
const override
{
return
std::make_shared<SimpleIdFactory>
(*
this
); }
20
21
SimpleIdFactory() {}
22
23
private
:
24
RecordId
_current{0};
25
};
26
27
class
SourceIdFactory :
public
IdFactory
{
28
public
:
29
RecordId
operator()()
override
{
30
if
(++_lower & _upperMask) {
31
--_lower;
32
throw
LSST_EXCEPT
(pex::exceptions::LengthError,
33
(boost::format(
"Next ID '%s' is too large for the number of reserved bits"
) %
34
(_lower + 1))
35
.str());
36
}
37
return
_upper | _lower;
38
}
39
40
void
notify(
RecordId
id
)
override
{
41
RecordId
newLower =
id
& (~_upper);
// chop off the exact exposure ID
42
if
(newLower & _upperMask) {
43
throw
LSST_EXCEPT
(
44
pex::exceptions::InvalidParameterError,
45
(boost::format(
"Explicit ID '%s' does not have the correct form."
) % newLower).str());
46
}
47
_lower = newLower;
48
}
49
50
std::shared_ptr<IdFactory>
clone
()
const override
{
return
std::make_shared<SourceIdFactory>
(*
this
); }
51
52
SourceIdFactory(
RecordId
expId,
int
reserved)
53
: _upper(expId << reserved),
54
_upperMask(std::numeric_limits<
RecordId
>::
max
() << reserved),
55
_lower(0) {
56
if
(_upper >> reserved != expId) {
57
throw
LSST_EXCEPT
(pex::exceptions::InvalidParameterError,
58
(boost::format(
"Exposure ID '%s' is too large."
) % expId).str());
59
}
60
}
61
62
private
:
63
RecordId
const
_upper;
64
RecordId
const
_upperMask;
65
RecordId
_lower;
66
};
67
68
}
// namespace
69
70
std::shared_ptr<IdFactory>
IdFactory::makeSimple
() {
return
std::make_shared<SimpleIdFactory>
(); }
71
72
std::shared_ptr<IdFactory>
IdFactory::makeSource
(
RecordId
expId,
int
reserved) {
73
return
std::make_shared<SourceIdFactory>
(expId, reserved);
74
}
75
}
// namespace table
76
}
// namespace afw
77
}
// namespace lsst
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
IdFactory.h
lsst::afw::table::IdFactory
A polymorphic functor base class for generating record IDs for a table.
Definition
IdFactory.h:21
lsst::afw::table::IdFactory::makeSimple
static std::shared_ptr< IdFactory > makeSimple()
Return a simple IdFactory that simply counts from 1.
Definition
IdFactory.cc:70
lsst::afw::table::IdFactory::makeSource
static std::shared_ptr< IdFactory > makeSource(RecordId expId, int reserved)
Return an IdFactory that includes another, fixed ID in the higher-order bits.
Definition
IdFactory.cc:72
exceptions.h
std::make_shared
T make_shared(T... args)
std::max
T max(T... args)
lsst::afw::table._match.clone
clone
Definition
_match.py:104
lsst::afw::table
Definition
table.dox:3
lsst::afw::table::RecordId
std::int64_t RecordId
Type used for unique IDs for records.
Definition
misc.h:21
lsst::afw
Definition
imageAlgorithm.dox:1
lsst
std::shared_ptr
Generated on
for lsst.afw by
1.17.0