Files
rippled/src/test/csf/Validation.h
Scott Schurr 3b33318dc8 Prefer std::optional over boost:optional:
Some of the boost::optionals must remain for now.  Both
boost::beast and SOCI have interfaces that require
boost::optional.
2021-03-11 14:35:31 -08:00

206 lines
4.4 KiB
C++

//------------------------------------------------------------------------------
/*
This file is part of rippled: https://github.com/ripple/rippled
Copyright (c) 2012-2017 Ripple Labs Inc
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
//==============================================================================
#ifndef RIPPLE_TEST_CSF_VALIDATION_H_INCLUDED
#define RIPPLE_TEST_CSF_VALIDATION_H_INCLUDED
#include <ripple/basics/tagged_integer.h>
#include <test/csf/ledgers.h>
#include <memory>
#include <optional>
#include <utility>
namespace ripple {
namespace test {
namespace csf {
struct PeerIDTag;
//< Uniquely identifies a peer
using PeerID = tagged_integer<std::uint32_t, PeerIDTag>;
/** The current key of a peer
Eventually, the second entry in the pair can be used to model ephemeral
keys. Right now, the convention is to have the second entry 0 as the
master key.
*/
using PeerKey = std::pair<PeerID, std::uint32_t>;
/** Validation of a specific ledger by a specific Peer.
*/
class Validation
{
Ledger::ID ledgerID_{0};
Ledger::Seq seq_{0};
NetClock::time_point signTime_;
NetClock::time_point seenTime_;
PeerKey key_;
PeerID nodeID_{0};
bool trusted_ = false;
bool full_ = false;
std::optional<std::uint32_t> loadFee_;
std::uint64_t cookie_{0};
public:
using NodeKey = PeerKey;
using NodeID = PeerID;
Validation(
Ledger::ID id,
Ledger::Seq seq,
NetClock::time_point sign,
NetClock::time_point seen,
PeerKey key,
PeerID nodeID,
bool full,
std::optional<std::uint32_t> loadFee = std::nullopt,
std::uint64_t cookie = 0)
: ledgerID_{id}
, seq_{seq}
, signTime_{sign}
, seenTime_{seen}
, key_{key}
, nodeID_{nodeID}
, full_{full}
, loadFee_{loadFee}
, cookie_{cookie}
{
}
Ledger::ID
ledgerID() const
{
return ledgerID_;
}
Ledger::Seq
seq() const
{
return seq_;
}
NetClock::time_point
signTime() const
{
return signTime_;
}
NetClock::time_point
seenTime() const
{
return seenTime_;
}
PeerKey const&
key() const
{
return key_;
}
PeerID const&
nodeID() const
{
return nodeID_;
}
bool
trusted() const
{
return trusted_;
}
bool
full() const
{
return full_;
}
std::uint64_t
cookie() const
{
return cookie_;
}
std::optional<std::uint32_t>
loadFee() const
{
return loadFee_;
}
Validation const&
unwrap() const
{
// For the rippled implementation in which RCLValidation wraps
// STValidation, the csf::Validation has no more specific type it
// wraps, so csf::Validation unwraps to itself
return *this;
}
auto
asTie() const
{
// trusted is a status set by the receiver, so it is not part of the tie
return std::tie(
ledgerID_,
seq_,
signTime_,
seenTime_,
key_,
nodeID_,
loadFee_,
full_);
}
bool
operator==(Validation const& o) const
{
return asTie() == o.asTie();
}
bool
operator<(Validation const& o) const
{
return asTie() < o.asTie();
}
void
setTrusted()
{
trusted_ = true;
}
void
setUntrusted()
{
trusted_ = false;
}
void
setSeen(NetClock::time_point seen)
{
seenTime_ = seen;
}
};
} // namespace csf
} // namespace test
} // namespace ripple
#endif