25 #include <boost/lexical_cast.hpp>
30 const ndn::time::system_clock::time_point& timepoint,
31 double radius, std::vector<double> angles)
32 :
Lsa(originRouter, seqNo, timepoint)
33 , m_hyperbolicRadius(radius)
34 , m_hyperbolicAngles(angles)
46 if (clsa.
getCorTheta().size() != m_hyperbolicAngles.size()) {
51 for (
unsigned int i = 0; i < clsa.
getCorTheta().size(); i++) {
52 if (std::abs(m_hyperbolicAngles[i] - m_angles2[i]) > std::numeric_limits<double>::epsilon()) {
57 return (std::abs(m_hyperbolicRadius - clsa.
getCorRadius()) <
58 std::numeric_limits<double>::epsilon());
61 template<ndn::encoding::Tag TAG>
65 size_t totalLength = 0;
67 for (
auto it = m_hyperbolicAngles.rbegin(); it != m_hyperbolicAngles.rend(); ++it) {
75 totalLength += block.prependVarNumber(totalLength);
90 ndn::EncodingEstimator estimator;
93 ndn::EncodingBuffer buffer(estimatedSize, 0);
112 auto val =
m_wire.elements_begin();
119 NDN_THROW(
Error(
"Missing required Lsa field"));
123 m_hyperbolicRadius = ndn::encoding::readDouble(*val);
127 NDN_THROW(
Error(
"Missing required HyperbolicRadius field"));
130 std::vector<double> angles;
131 for (; val !=
m_wire.elements_end(); ++val) {
133 angles.push_back(ndn::encoding::readDouble(*val));
136 NDN_THROW(
Error(
"Missing required HyperbolicAngle field"));
139 m_hyperbolicAngles = angles;
145 std::ostringstream os;
147 os <<
" Hyperbolic Radius : " << m_hyperbolicRadius <<
"\n";
149 for (
const auto& value : m_hyperbolicAngles) {
150 os <<
" Hyperbolic Theta " << i++ <<
" : " << value <<
"\n";
156 std::tuple<bool, std::list<ndn::Name>, std::list<ndn::Name>>
159 auto clsa = std::static_pointer_cast<CoordinateLsa>(lsa);
161 m_hyperbolicRadius = clsa->getCorRadius();
162 m_hyperbolicAngles.clear();
163 for (
const auto& angle : clsa->getCorTheta()) {
164 m_hyperbolicAngles.push_back(angle);
166 return {
true, std::list<ndn::Name>{}, std::list<ndn::Name>{}};
168 return {
false, std::list<ndn::Name>{}, std::list<ndn::Name>{}};
Data abstraction for CoordinateLsa CoordinateLsa := COORDINATE-LSA-TYPE TLV-LENGTH Lsa HyperbolicRadi...
const ndn::Block & wireEncode() const override
double getCorRadius() const
void wireDecode(const ndn::Block &wire)
const std::vector< double > getCorTheta() const
bool isEqualContent(const CoordinateLsa &clsa) const
std::tuple< bool, std::list< ndn::Name >, std::list< ndn::Name > > update(const std::shared_ptr< Lsa > &lsa) override
std::string toString() const override
Data abstraction for Lsa Lsa := LSA-TYPE TLV-LENGTH Name SequenceNumber ExpirationTimePoint.
virtual const ndn::Block & wireEncode() const =0
std::string getString() const
void wireDecode(const ndn::Block &wire)
Copyright (c) 2014-2020, The University of Memphis, Regents of the University of California.
std::ostream & operator<<(std::ostream &os, const Adjacent &adjacent)
NDN_CXX_DEFINE_WIRE_ENCODE_INSTANTIATIONS(Adjacent)