13 // The 'domain' part of an email address: DNS domain, or IP address, or address
20 inline explicit Domain(std::string_view dom
);
23 validate(std::string_view domain
, std::string
& msg
, Domain
& dom
);
27 inline bool empty() const;
29 inline bool operator==(Domain
const& rhs
) const;
30 inline auto operator<=>(Domain
const& rhs
) const;
32 inline bool is_address_literal() const;
33 inline bool is_unicode() const;
35 inline std::string
const& ascii() const;
36 inline std::string
const& utf8() const;
39 bool set_(std::string_view dom
, bool should_throw
, std::string
& msg
);
41 std::string ascii_
; // A-labels
42 std::string utf8_
; // U-labels, or empty
44 bool is_address_literal_
{false};
47 Domain::Domain(std::string_view dom
)
50 set_(dom
, true /* throw */, msg
);
53 bool Domain::validate(std::string_view domain
, std::string
& msg
, Domain
& dom
)
55 return dom
.set_(domain
, false /* don't throw */, msg
);
62 is_address_literal_
= false;
65 bool Domain::empty() const { return ascii_
.empty(); }
67 bool Domain::operator==(Domain
const& rhs
) const
69 return ascii_
== rhs
.ascii_
;
72 auto Domain::operator<=>(const Domain
& rhs
) const
74 return ascii_
<=> rhs
.ascii_
;
77 bool Domain::is_address_literal() const { return is_address_literal_
; }
78 bool Domain::is_unicode() const
80 return (!utf8().empty()) && (utf8() != ascii());
83 std::string
const& Domain::ascii() const { return ascii_
; }
84 std::string
const& Domain::utf8() const
86 return utf8_
.empty() ? ascii_
: utf8_
;
89 inline std::ostream
& operator<<(std::ostream
& os
, Domain
const& dom
)
92 return os
<< '{' << dom
.ascii() << ',' << dom
.utf8() << '}';
93 return os
<< dom
.ascii();
97 bool is_fully_qualified(Domain
const& dom
, std::string
& msg
);
102 struct hash
<Domain
> {
103 std::size_t operator()(Domain
const& k
) const
105 return hash
<std::string
>()(k
.ascii());
110 #endif // DOMAIN_DOT_HPP