Stroika Library 3.0d25
 
Loading...
Searching...
No Matches
CIDR.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
6#include "Stroika/Foundation/Characters/String2Int.h"
9#include "Stroika/Foundation/Execution/Exceptions.h"
10#include "Stroika/Foundation/Math/Common.h"
11
12#include "CIDR.h"
13
14using namespace Stroika::Foundation;
16using namespace Stroika::Foundation::IO;
18
19/*
20 ********************************************************************************
21 ******************************** Network::CIDR *********************************
22 ********************************************************************************
23 */
24CIDR::CIDR (const InternetAddress& internetAddress, unsigned int significantBits)
25 : fBaseAddress_{internetAddress.KeepSignificantBits (significantBits)}
26 , fSignificantBits_{significantBits}
27{
28}
29
30namespace {
31 CIDR read_ (const String& cidrNotation, InternetAddress::AddressFamily addressFamily)
32 {
33 if (auto i = cidrNotation.RFind ('/')) {
34 InternetAddress ia{cidrNotation.SubString (0, *i), addressFamily};
35 unsigned int nBits = Characters::String2Int<unsigned int> (cidrNotation.SubString (*i + 1));
36 if (not ia.GetAddressSize ().has_value ()) [[unlikely]] {
38 Execution::Exception<runtime_error>{"CIDR format exception: cannot use CIDR notation with that type of internet address"sv};
39 Execution::Throw (k_);
40 }
41 if (*ia.GetAddressSize () * 8 < nBits) [[unlikely]] {
43 Execution::Exception<runtime_error>{"CIDR format exception: number of significant bits too large"sv};
44 Execution::Throw (k_);
45 }
46 return CIDR{ia, nBits};
47 }
49 Execution::Exception<runtime_error>{"CIDR format exception: doesn't contain a / character"sv};
50 Execution::Throw (k_);
51 }
52}
53
54CIDR::CIDR (const String& cidrNotation, InternetAddress::AddressFamily addressFamily)
55 : CIDR{read_ (cidrNotation, addressFamily)}
56{
57}
58
59template <>
61{
63 sb << fBaseAddress_.As<String> () << "/"sv << (int)fSignificantBits_;
64 return sb;
65}
66
68{
70 sb << fBaseAddress_ << "/"sv << (int)fSignificantBits_;
71 return sb;
72}
73
75{
76 Require (fBaseAddress_.GetAddressSize ().has_value ());
77 size_t offset = *fBaseAddress_.GetAddressSize () * 8 - fSignificantBits_;
78 return Traversal::DiscreteRange<InternetAddress>{fBaseAddress_, fBaseAddress_.PinLowOrderBitsToMax (static_cast<unsigned int> (offset))};
79}
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
nonvirtual String SubString(SZ from) const
nonvirtual optional< size_t > RFind(Character c) const noexcept
Definition String.cpp:1070
Exception<> is a replacement (subclass) for any std c++ exception class (e.g. the default 'std::excep...
Definition Exceptions.h:219
nonvirtual Traversal::DiscreteRange< InternetAddress > GetRange() const
Definition CIDR.cpp:74
nonvirtual String ToString() const
Definition CIDR.cpp:67
A DiscreteRange is a Range where the underlying endpoints are integral (discrete, not continuous); th...