Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
CIDR.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. 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]] {
37 static const Execution::RuntimeErrorException k_ =
38 Execution::RuntimeErrorException{"CIDR format exception: cannot use CIDR notation with that type of internet address"sv};
40 }
41 if (*ia.GetAddressSize () * 8 < nBits) [[unlikely]] {
42 static const Execution::RuntimeErrorException k_ =
43 Execution::RuntimeErrorException{"CIDR format exception: number of significant bits too large"sv};
45 }
46 return CIDR{ia, nBits};
47 }
48 static const Execution::RuntimeErrorException k_ = Execution::RuntimeErrorException{"CIDR format exception: doesn't contain a / character"sv};
50 }
51}
52
53CIDR::CIDR (const String& cidrNotation, InternetAddress::AddressFamily addressFamily)
54 : CIDR{read_ (cidrNotation, addressFamily)}
55{
56}
57
58template <>
59String CIDR::As<String> () const
60{
62 sb << fBaseAddress_.As<String> () << "/"sv << (int)fSignificantBits_;
63 return sb;
64}
65
67{
69 sb << fBaseAddress_ << "/"sv << (int)fSignificantBits_;
70 return sb;
71}
72
74{
75 Require (fBaseAddress_.GetAddressSize ().has_value ());
76 size_t offset = *fBaseAddress_.GetAddressSize () * 8 - fSignificantBits_;
77 return Traversal::DiscreteRange<InternetAddress>{fBaseAddress_, fBaseAddress_.PinLowOrderBitsToMax (static_cast<unsigned int> (offset))};
78}
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:1011
nonvirtual Traversal::DiscreteRange< InternetAddress > GetRange() const
Definition CIDR.cpp:73
nonvirtual String ToString() const
Definition CIDR.cpp:66
A DiscreteRange is a Range where the underlying endpoints are integral (discrete, not continuous); th...
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...
Definition Throw.inl:43