A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
ipv6-address.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2007-2008 Louis Pasteur University
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
7 */
8
9#ifndef IPV6_ADDRESS_H
10#define IPV6_ADDRESS_H
11
12#include "ipv4-address.h"
13#include "mac8-address.h"
14
15#include "ns3/address.h"
16#include "ns3/attribute-helper.h"
17
18#include <cstring>
19#include <ostream>
20#include <stdint.h>
21
22namespace ns3
23{
24
25class Ipv6Prefix;
26class Mac16Address;
27class Mac48Address;
28class Mac64Address;
29
30/**
31 * \ingroup address
32 * \class Ipv6Address
33 * \brief Describes an IPv6 address.
34 * \see Ipv6Prefix
35 * \see attribute_Ipv6Address
36 */
38{
39 public:
40 /**
41 * \brief Default constructor.
42 */
44
45 /**
46 * \brief Constructs an Ipv6Address by parsing the input C-string.
47 * \param address the C-string containing the IPv6 address (e.g. 2001:660:4701::1).
48 */
49 Ipv6Address(const char* address);
50
51 /**
52 * \brief Constructs an Ipv6Address by using the input 16 bytes.
53 * \param address the 128-bit address
54 * \warning the parameter must point on a 16 bytes integer array!
55 */
56 Ipv6Address(uint8_t address[16]);
57
58 /**
59 * \brief Copy constructor.
60 * \param addr Ipv6Address object
61 */
62 Ipv6Address(const Ipv6Address& addr);
63
64 /**
65 * \brief Copy constructor.
66 * \param addr Ipv6Address pointer
67 */
68 Ipv6Address(const Ipv6Address* addr);
69
70 /**
71 * \brief Destructor.
72 */
74
75 /**
76 * \brief Sets an Ipv6Address by parsing the input C-string.
77 * \param address the C-string containing the IPv6 address (e.g. 2001:660:4701::1).
78 */
79 void Set(const char* address);
80
81 /**
82 * \brief Set an Ipv6Address by using the input 16 bytes.
83 *
84 * \param address the 128-bit address
85 * \warning the parameter must point on a 16 bytes integer array!
86 */
87 void Set(uint8_t address[16]);
88
89 /**
90 * \brief Serialize this address to a 16-byte buffer.
91 * \param buf the output buffer to which this address gets overwritten with this
92 * Ipv6Address
93 */
94 void Serialize(uint8_t buf[16]) const;
95
96 /**
97 * \brief Deserialize this address.
98 * \param buf buffer to read address from
99 * \return an Ipv6Address
100 */
101 static Ipv6Address Deserialize(const uint8_t buf[16]);
102
103 /**
104 * \brief Make the solicited IPv6 address.
105 * \param addr the IPv6 address
106 * \return Solicited IPv6 address
107 */
109
110 /**
111 * \brief Make the Ipv4-mapped IPv6 address.
112 * \param addr the IPv4 address
113 * \return Ipv4-mapped IPv6 address
114 */
116
117 /**
118 * \brief Return the Ipv4 address.
119 * \return Ipv4 address
120 */
122
123 /**
124 * \brief Make the autoconfigured IPv6 address from a Mac address.
125 *
126 * Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
127 *
128 * \param addr the MAC address.
129 * \param prefix the IPv6 prefix
130 * \return autoconfigured IPv6 address
131 */
133
134 /**
135 * \brief Make the autoconfigured IPv6 address from a Mac address.
136 *
137 * Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
138 *
139 * \param addr the MAC address.
140 * \param prefix the IPv6 prefix
141 * \return autoconfigured IPv6 address
142 */
143
145
146 /**
147 * \brief Make the autoconfigured IPv6 address with Mac16Address.
148 *
149 * The EUI-64 scheme used is based on the \RFC{4944}.
150 *
151 * \param addr the MAC address (16 bits).
152 * \param prefix the IPv6 prefix
153 * \return autoconfigured IPv6 address
154 */
156
157 /**
158 * \brief Make the autoconfigured IPv6 address with Mac48Address.
159 *
160 * The EUI-64 scheme used is based on \RFC{2464}.
161 *
162 * \param addr the MAC address (48 bits).
163 * \param prefix the IPv6 prefix
164 * \return autoconfigured IPv6 address
165 */
167
168 /**
169 * \brief Make the autoconfigured IPv6 address with Mac64Address.
170 * \param addr the MAC address (64 bits).
171 * \param prefix the IPv6 prefix
172 * \return autoconfigured IPv6 address
173 */
175
176 /**
177 * \brief Make the autoconfigured IPv6 address with Mac8Address.
178 *
179 * The EUI-64 scheme used is loosely based on the \RFC{2464}.
180 *
181 * \param addr the Mac8Address address (8 bits).
182 * \param prefix the IPv6 prefix
183 * \return autoconfigured IPv6 address
184 */
186
187 /**
188 * \brief Make the autoconfigured link-local IPv6 address from a Mac address.
189 *
190 * Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
191 *
192 * \param mac the MAC address.
193 * \return autoconfigured link-local IPv6 address
194 */
196
197 /**
198 * \brief Make the autoconfigured link-local IPv6 address with Mac16Address.
199 *
200 * The EUI-64 scheme used is based on the \RFC{4944}.
201 *
202 * \param mac the MAC address (16 bits).
203 * \return autoconfigured link-local IPv6 address
204 */
206
207 /**
208 * \brief Make the autoconfigured link-local IPv6 address with Mac48Address.
209 *
210 * The EUI-64 scheme used is based on \RFC{2464}.
211 *
212 * \param mac the MAC address (48 bits).
213 * \return autoconfigured link-local IPv6 address
214 */
216
217 /**
218 * \brief Make the autoconfigured link-local IPv6 address with Mac64Address.
219 * \param mac the MAC address (64 bits).
220 * \return autoconfigured link-local IPv6 address
221 */
223
224 /**
225 * \brief Make the autoconfigured link-local IPv6 address with Mac8Address.
226 *
227 * The EUI-64 scheme used is loosely based on the \RFC{2464}.
228 *
229 * \param mac the MAC address (8 bits).
230 * \return autoconfigured link-local IPv6 address
231 */
233
234 /**
235 * \brief Print this address to the given output stream.
236 *
237 * The print format is in the typical "2001:660:4701::1".
238 * \param os the output stream to which this Ipv6Address is printed
239 */
240 void Print(std::ostream& os) const;
241
242 /**
243 * \brief If the IPv6 address is localhost (::1).
244 * \return true if localhost, false otherwise
245 */
246 bool IsLocalhost() const;
247
248 /**
249 * \brief If the IPv6 address is multicast (ff00::/8).
250 * \return true if multicast, false otherwise
251 */
252 bool IsMulticast() const;
253
254 /**
255 * \brief If the IPv6 address is link-local multicast (ff02::/16).
256 * \return true if link-local multicast, false otherwise
257 */
258 bool IsLinkLocalMulticast() const;
259
260 /**
261 * \brief If the IPv6 address is "all nodes multicast" (ff02::1/8).
262 * \return true if "all nodes multicast", false otherwise
263 */
264 bool IsAllNodesMulticast() const;
265
266 /**
267 * \brief If the IPv6 address is "all routers multicast" (ff02::2/8).
268 * \return true if "all routers multicast", false otherwise
269 */
270 bool IsAllRoutersMulticast() const;
271
272 /**
273 * \brief If the IPv6 address is a link-local address (fe80::/64).
274 * \return true if the address is link-local, false otherwise
275 */
276 bool IsLinkLocal() const;
277
278 /**
279 * \brief If the IPv6 address is a Solicited multicast address.
280 * \return true if it is, false otherwise
281 */
282 bool IsSolicitedMulticast() const;
283
284 /**
285 * \brief If the IPv6 address is the "Any" address.
286 * \return true if it is, false otherwise
287 */
288 bool IsAny() const;
289
290 /**
291 * \brief If the IPv6 address is a documentation address (2001:DB8::/32).
292 * \return true if the address is documentation, false otherwise
293 */
294 bool IsDocumentation() const;
295
296 /**
297 * \brief Compares an address and a prefix.
298 * \param prefix the prefix to compare with
299 * \return true if the address has the given prefix
300 */
301 bool HasPrefix(const Ipv6Prefix& prefix) const;
302
303 /**
304 * \brief Combine this address with a prefix.
305 * \param prefix a IPv6 prefix
306 * \return an IPv6 address that is this address combined
307 * (bitwise AND) with a prefix, yielding an IPv6 network address.
308 */
309 Ipv6Address CombinePrefix(const Ipv6Prefix& prefix) const;
310
311 /**
312 * \brief If the Address matches the type.
313 * \param address other address
314 * \return true if the type matches, false otherwise
315 */
316 static bool IsMatchingType(const Address& address);
317
318 /**
319 * \brief If the address is an IPv4-mapped address
320 * \return true if address is an IPv4-mapped address, otherwise false.
321 */
322 bool IsIpv4MappedAddress() const;
323
324 /**
325 * \brief Convert to Address object
326 */
327 operator Address() const;
328
329 /**
330 * \brief Convert the Address object into an Ipv6Address ones.
331 * \param address address to convert
332 * \return an Ipv6Address
333 */
334 static Ipv6Address ConvertFrom(const Address& address);
335
336 /**
337 * \brief convert the IPv6Address object to an Address object.
338 * \return the Address object corresponding to this object.
339 */
340 Address ConvertTo() const;
341
342 /**
343 * \return true if address is initialized (i.e., set to something), false otherwise
344 */
345 bool IsInitialized() const;
346
347 /**
348 * \brief Get the 0 (::) Ipv6Address.
349 * \return the :: Ipv6Address representation
350 */
351 static Ipv6Address GetZero();
352
353 /**
354 * \brief Get the "any" (::) Ipv6Address.
355 * \return the "any" (::) Ipv6Address
356 */
357 static Ipv6Address GetAny();
358
359 /**
360 * \brief Get the "all nodes multicast" address.
361 * \return the "ff02::2/8" Ipv6Address representation
362 */
364
365 /**
366 * \brief Get the "all routers multicast" address.
367 * \return the "ff02::2/8" Ipv6Address representation
368 */
370
371 /**
372 * \brief Get the "all hosts multicast" address.
373 * \return the "ff02::3/8" Ipv6Address representation
374 */
376
377 /**
378 * \brief Get the loopback address.
379 * \return the "::1/128" Ipv6Address representation.
380 */
381 static Ipv6Address GetLoopback();
382
383 /**
384 * \brief Get the "all-1" IPv6 address (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
385 * \return all-1 Ipv6Address representation
386 */
387 static Ipv6Address GetOnes();
388
389 /**
390 * \brief Get the bytes corresponding to the address.
391 * \param buf buffer to store the data
392 */
393 void GetBytes(uint8_t buf[16]) const;
394
395 private:
396 /**
397 * \brief Return the Type of address.
398 * \return type of address
399 */
400 static uint8_t GetType();
401
402 /**
403 * \brief The address representation on 128 bits (16 bytes).
404 */
405 uint8_t m_address[16];
406 bool m_initialized; //!< IPv6 address has been explicitly initialized to a valid value.
407
408 /**
409 * \brief Equal to operator.
410 *
411 * \param a the first operand.
412 * \param b the first operand.
413 * \returns true if the operands are equal.
414 */
415 friend bool operator==(const Ipv6Address& a, const Ipv6Address& b);
416
417 /**
418 * \brief Not equal to operator.
419 *
420 * \param a the first operand.
421 * \param b the first operand.
422 * \returns true if the operands are not equal.
423 */
424 friend bool operator!=(const Ipv6Address& a, const Ipv6Address& b);
425
426 /**
427 * \brief Less than to operator.
428 *
429 * \param a the first operand.
430 * \param b the first operand.
431 * \returns true if the first operand is less than the second.
432 */
433 friend bool operator<(const Ipv6Address& a, const Ipv6Address& b);
434};
435
436/**
437 * \ingroup address
438 * \class Ipv6Prefix
439 * \brief Describes an IPv6 prefix. It is just a bitmask like Ipv4Mask.
440 * \see Ipv6Address
441 * \see attribute_Ipv6Prefix
442 */
444{
445 public:
446 /**
447 * \brief Default constructor.
448 */
449 Ipv6Prefix();
450
451 /**
452 * \brief Constructs an Ipv6Prefix by using the input 16 bytes.
453 *
454 * The prefix length is calculated as the minimum prefix length, i.e.,
455 * 2001:db8:cafe:: will have a 47 bit prefix length.
456 *
457 * \param prefix the 128-bit prefix
458 */
459 Ipv6Prefix(uint8_t prefix[16]);
460
461 /**
462 * \brief Constructs an Ipv6Prefix by using the input string.
463 *
464 * The prefix length is calculated as the minimum prefix length, i.e.,
465 * 2001:db8:cafe:: will have a 47 bit prefix length.
466 *
467 * \param prefix the 128-bit prefix
468 */
469 Ipv6Prefix(const char* prefix);
470
471 /**
472 * \brief Constructs an Ipv6Prefix by using the input 16 bytes.
473 * \param prefix the 128-bit prefix
474 * \param prefixLength the prefix length
475 */
476 Ipv6Prefix(uint8_t prefix[16], uint8_t prefixLength);
477
478 /**
479 * \brief Constructs an Ipv6Prefix by using the input string.
480 * \param prefix the 128-bit prefix
481 * \param prefixLength the prefix length
482 */
483 Ipv6Prefix(const char* prefix, uint8_t prefixLength);
484
485 /**
486 * \brief Constructs an Ipv6Prefix by using the input number of bits.
487 * \param prefix number of bits of the prefix (0 - 128)
488 * \note A valid number of bits is between 0 and 128).
489 */
490 Ipv6Prefix(uint8_t prefix);
491
492 /**
493 * \brief Copy constructor.
494 * \param prefix Ipv6Prefix object
495 */
496 Ipv6Prefix(const Ipv6Prefix& prefix);
497
498 /**
499 * \brief Copy constructor.
500 * \param prefix Ipv6Prefix pointer
501 */
502 Ipv6Prefix(const Ipv6Prefix* prefix);
503
504 /**
505 * \brief Destructor.
506 */
507 ~Ipv6Prefix();
508
509 /**
510 * \brief If the Address match the type.
511 * \param a a first address
512 * \param b a second address
513 * \return true if the type match, false otherwise
514 */
515 bool IsMatch(Ipv6Address a, Ipv6Address b) const;
516
517 /**
518 * \brief Get the bytes corresponding to the prefix.
519 * \param buf buffer to store the data
520 */
521 void GetBytes(uint8_t buf[16]) const;
522
523 /**
524 * \brief Convert the Prefix into an IPv6 Address.
525 * \return an IPv6 address representing the prefix
526 */
528
529 /**
530 * \brief Get prefix length.
531 * \return prefix length
532 */
533 uint8_t GetPrefixLength() const;
534
535 /**
536 * \brief Set prefix length.
537 * \param prefixLength the prefix length
538 */
539 void SetPrefixLength(uint8_t prefixLength);
540
541 /**
542 * \brief Get the minimum prefix length, i.e., 128 - the length of the largest sequence
543 * trailing zeroes.
544 * \return minimum prefix length
545 */
546 uint8_t GetMinimumPrefixLength() const;
547
548 /**
549 * \brief Print this address to the given output stream.
550 *
551 * The print format is in the typical "2001:660:4701::1".
552 * \param os the output stream to which this Ipv6Address is printed
553 */
554 void Print(std::ostream& os) const;
555
556 /**
557 * \brief Get the loopback prefix ( /128).
558 * \return a Ipv6Prefix corresponding to loopback prefix
559 */
560 static Ipv6Prefix GetLoopback();
561
562 /**
563 * \brief Get the "all-1" IPv6 mask (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
564 * \return /128 Ipv6Prefix representation
565 */
566 static Ipv6Prefix GetOnes();
567
568 /**
569 * \brief Get the zero prefix ( /0).
570 * \return an Ipv6Prefix
571 */
572 static Ipv6Prefix GetZero();
573
574 private:
575 /**
576 * \brief The prefix representation.
577 */
578 uint8_t m_prefix[16];
579
580 /**
581 * \brief The prefix length.
582 */
584
585 /**
586 * \brief Equal to operator.
587 *
588 * \param a the first operand
589 * \param b the first operand
590 * \returns true if the operands are equal
591 */
592 friend bool operator==(const Ipv6Prefix& a, const Ipv6Prefix& b);
593
594 /**
595 * \brief Not equal to operator.
596 *
597 * \param a the first operand
598 * \param b the first operand
599 * \returns true if the operands are not equal
600 */
601 friend bool operator!=(const Ipv6Prefix& a, const Ipv6Prefix& b);
602};
603
606
607/**
608 * \brief Stream insertion operator.
609 *
610 * \param os the reference to the output stream
611 * \param address the Ipv6Address
612 * \returns the reference to the output stream
613 */
614std::ostream& operator<<(std::ostream& os, const Ipv6Address& address);
615
616/**
617 * \brief Stream insertion operator.
618 *
619 * \param os the reference to the output stream
620 * \param prefix the Ipv6Prefix
621 * \returns the reference to the output stream
622 */
623std::ostream& operator<<(std::ostream& os, const Ipv6Prefix& prefix);
624
625/**
626 * \brief Stream extraction operator.
627 *
628 * \param is the reference to the input stream
629 * \param address the Ipv6Address
630 * \returns the reference to the input stream
631 */
632std::istream& operator>>(std::istream& is, Ipv6Address& address);
633
634/**
635 * \brief Stream extraction operator.
636 *
637 * \param is the reference to the input stream
638 * \param prefix the Ipv6Prefix
639 * \returns the reference to the input stream
640 */
641std::istream& operator>>(std::istream& is, Ipv6Prefix& prefix);
642
643inline bool
645{
646 return !std::memcmp(a.m_address, b.m_address, 16);
647}
648
649inline bool
651{
652 return std::memcmp(a.m_address, b.m_address, 16);
653}
654
655inline bool
656operator<(const Ipv6Address& a, const Ipv6Address& b)
657{
658 return std::memcmp(a.m_address, b.m_address, 16) < 0;
659}
660
661inline bool
663{
664 return !std::memcmp(a.m_prefix, b.m_prefix, 16);
665}
666
667inline bool
669{
670 return std::memcmp(a.m_prefix, b.m_prefix, 16);
671}
672
673/**
674 * \class Ipv6AddressHash
675 * \brief Hash function class for IPv6 addresses.
676 */
678{
679 public:
680 /**
681 * \brief Returns the hash of an IPv6 address.
682 * \param x IPv6 address to hash
683 * \returns the hash of the address
684 */
685 size_t operator()(const Ipv6Address& x) const;
686};
687
688} /* namespace ns3 */
689
690#endif /* IPV6_ADDRESS_H */
a polymophic address class
Definition address.h:90
Ipv4 addresses are stored in host order in this class.
Hash function class for IPv6 addresses.
size_t operator()(const Ipv6Address &x) const
Returns the hash of an IPv6 address.
Describes an IPv6 address.
static uint8_t GetType()
Return the Type of address.
bool IsLinkLocal() const
If the IPv6 address is a link-local address (fe80::/64).
friend bool operator!=(const Ipv6Address &a, const Ipv6Address &b)
Not equal to operator.
bool HasPrefix(const Ipv6Prefix &prefix) const
Compares an address and a prefix.
bool IsSolicitedMulticast() const
If the IPv6 address is a Solicited multicast address.
static Ipv6Address GetAllNodesMulticast()
Get the "all nodes multicast" address.
void Print(std::ostream &os) const
Print this address to the given output stream.
static Ipv6Address MakeSolicitedAddress(Ipv6Address addr)
Make the solicited IPv6 address.
friend bool operator==(const Ipv6Address &a, const Ipv6Address &b)
Equal to operator.
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
bool IsDocumentation() const
If the IPv6 address is a documentation address (2001:DB8::/32).
static Ipv6Address GetAllHostsMulticast()
Get the "all hosts multicast" address.
bool IsAllNodesMulticast() const
If the IPv6 address is "all nodes multicast" (ff02::1/8).
bool IsLinkLocalMulticast() const
If the IPv6 address is link-local multicast (ff02::/16).
friend bool operator<(const Ipv6Address &a, const Ipv6Address &b)
Less than to operator.
static Ipv6Address Deserialize(const uint8_t buf[16])
Deserialize this address.
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
static Ipv6Address MakeAutoconfiguredAddress(Address addr, Ipv6Address prefix)
Make the autoconfigured IPv6 address from a Mac address.
~Ipv6Address()
Destructor.
bool IsMulticast() const
If the IPv6 address is multicast (ff00::/8).
void GetBytes(uint8_t buf[16]) const
Get the bytes corresponding to the address.
bool IsIpv4MappedAddress() const
If the address is an IPv4-mapped address.
void Set(const char *address)
Sets an Ipv6Address by parsing the input C-string.
void Serialize(uint8_t buf[16]) const
Serialize this address to a 16-byte buffer.
Ipv6Address()
Default constructor.
Address ConvertTo() const
convert the IPv6Address object to an Address object.
bool IsAny() const
If the IPv6 address is the "Any" address.
static Ipv6Address GetAllRoutersMulticast()
Get the "all routers multicast" address.
bool IsLocalhost() const
If the IPv6 address is localhost (::1).
bool m_initialized
IPv6 address has been explicitly initialized to a valid value.
uint8_t m_address[16]
The address representation on 128 bits (16 bytes).
static Ipv6Address ConvertFrom(const Address &address)
Convert the Address object into an Ipv6Address ones.
bool IsInitialized() const
static Ipv6Address GetOnes()
Get the "all-1" IPv6 address (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
static Ipv6Address MakeAutoconfiguredLinkLocalAddress(Address mac)
Make the autoconfigured link-local IPv6 address from a Mac address.
Ipv4Address GetIpv4MappedAddress() const
Return the Ipv4 address.
static bool IsMatchingType(const Address &address)
If the Address matches the type.
static Ipv6Address MakeIpv4MappedAddress(Ipv4Address addr)
Make the Ipv4-mapped IPv6 address.
static Ipv6Address GetLoopback()
Get the loopback address.
Ipv6Address CombinePrefix(const Ipv6Prefix &prefix) const
Combine this address with a prefix.
bool IsAllRoutersMulticast() const
If the IPv6 address is "all routers multicast" (ff02::2/8).
Describes an IPv6 prefix.
uint8_t m_prefixLength
The prefix length.
static Ipv6Prefix GetLoopback()
Get the loopback prefix ( /128).
~Ipv6Prefix()
Destructor.
uint8_t m_prefix[16]
The prefix representation.
friend bool operator==(const Ipv6Prefix &a, const Ipv6Prefix &b)
Equal to operator.
void Print(std::ostream &os) const
Print this address to the given output stream.
uint8_t GetPrefixLength() const
Get prefix length.
Ipv6Address ConvertToIpv6Address() const
Convert the Prefix into an IPv6 Address.
static Ipv6Prefix GetZero()
Get the zero prefix ( /0).
bool IsMatch(Ipv6Address a, Ipv6Address b) const
If the Address match the type.
static Ipv6Prefix GetOnes()
Get the "all-1" IPv6 mask (ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff).
friend bool operator!=(const Ipv6Prefix &a, const Ipv6Prefix &b)
Not equal to operator.
void SetPrefixLength(uint8_t prefixLength)
Set prefix length.
Ipv6Prefix()
Default constructor.
uint8_t GetMinimumPrefixLength() const
Get the minimum prefix length, i.e., 128 - the length of the largest sequence trailing zeroes.
void GetBytes(uint8_t buf[16]) const
Get the bytes corresponding to the prefix.
This class can contain 16 bit addresses.
an EUI-48 address
an EUI-64 address
A class used for addressing MAC8 MAC's.
#define ATTRIBUTE_HELPER_HEADER(type)
Declare the attribute value, accessor and checkers for class type
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool operator!=(Callback< R, Args... > a, Callback< R, Args... > b)
Inequality test.
Definition callback.h:658
bool operator==(const EventId &a, const EventId &b)
Definition event-id.h:155
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition angles.cc:148
std::istream & operator>>(std::istream &is, Angles &a)
Definition angles.cc:172
bool operator<(const EventId &a, const EventId &b)
Definition event-id.h:168