{"id":477,"date":"2020-05-28T03:49:02","date_gmt":"2020-05-27T17:49:02","guid":{"rendered":"https:\/\/ghiassy.net\/?p=477"},"modified":"2020-05-28T03:51:25","modified_gmt":"2020-05-27T17:51:25","slug":"c-ip-v4-data-type","status":"publish","type":"post","link":"https:\/\/ghiassy.net\/?p=477","title":{"rendered":"C++ IP v4 Data Type"},"content":{"rendered":"<p><span style=\"color: #00ff00;\">Hello,<\/span><\/p>\n<p><span style=\"color: #00ff00;\">The class below is one way to implement a class that can read IP address from user&#8217;s input in C++; <\/span><\/p>\n<p><span style=\"color: #00ff00;\">Can convert to string or\/and enumerate in range:<\/span><\/p>\n<p><!--more--><\/p>\n<pre class=\"lang:c++ decode:true \" title=\"IPv4 Address\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;sstream&gt;\r\n#include &lt;array&gt;\r\n\r\nusing namespace std;\r\nclass ipv4\r\n{\r\n    std::array&lt;unsigned char, 4&gt; data;\r\n\r\npublic:\r\n    constexpr ipv4() : data{{0}} {}\r\n    constexpr ipv4(unsigned char const a, unsigned char const b,\r\n                   unsigned char const c, unsigned char const d) : data{{a, b, c, d}} {}\r\n    explicit constexpr ipv4(unsigned long a) : data{{static_cast&lt;unsigned char&gt;((a &gt;&gt; 24) &amp; 0xFF),\r\n                                                     static_cast&lt;unsigned char&gt;((a &gt;&gt; 16) &amp; 0xFF),\r\n                                                     static_cast&lt;unsigned char&gt;((a &gt;&gt; 8) &amp; 0xFF),\r\n                                                     static_cast&lt;unsigned char&gt;(a &amp; 0xFF)}} {}\r\n    ipv4(ipv4 const &amp;other) noexcept : data(other.data) {}\r\n    ipv4 &amp;operator=(ipv4 const &amp;other) noexcept\r\n    {\r\n        data = other.data;\r\n        return *this;\r\n    }\r\n    std::string to_string() const\r\n    {\r\n        std::stringstream sstr;\r\n        sstr &lt;&lt; *this;\r\n        return sstr.str();\r\n    }\r\n    constexpr unsigned long to_ulong() const noexcept\r\n    {\r\n        return (static_cast&lt;unsigned long&gt;(data[0]) &lt;&lt; 24) |\r\n               (static_cast&lt;unsigned long&gt;(data[1]) &lt;&lt; 16) |\r\n               (static_cast&lt;unsigned long&gt;(data[2]) &lt;&lt; 8) |\r\n               static_cast&lt;unsigned long&gt;(data[3]);\r\n    }\r\n    friend std::ostream &amp;operator&lt;&lt;(std::ostream &amp;os, const ipv4 &amp;a)\r\n    {\r\n        os &lt;&lt; static_cast&lt;int&gt;(a.data[0]) &lt;&lt; '.'\r\n           &lt;&lt; static_cast&lt;int&gt;(a.data[1]) &lt;&lt; '.'\r\n           &lt;&lt; static_cast&lt;int&gt;(a.data[2]) &lt;&lt; '.'\r\n           &lt;&lt; static_cast&lt;int&gt;(a.data[3]);\r\n        return os;\r\n    }\r\n    friend std::istream &amp;operator&gt;&gt;(std::istream &amp;is, ipv4 &amp;a)\r\n    {\r\n        char d1, d2, d3;\r\n        int b1, b2, b3, b4;\r\n        is &gt;&gt; b1 &gt;&gt; d1 &gt;&gt; b2 &gt;&gt; d2 &gt;&gt; b3 &gt;&gt; d3 &gt;&gt; b4;\r\n        if (d1 == '.' &amp;&amp; d2 == '.' &amp;&amp; d3 == '.')\r\n            a = ipv4(b1, b2, b3, b4);\r\n        else\r\n            is.setstate(std::ios_base::failbit);\r\n        return is;\r\n    }\r\n\r\n    ipv4 &amp;operator++()\r\n    {\r\n        *this = ipv4(1 + to_ulong());\r\n        return *this;\r\n    }\r\n    ipv4 &amp;operator++(int)\r\n    {\r\n        ipv4 result(*this);\r\n        ++(*this);\r\n        return *this;\r\n    }\r\n    friend bool operator==(ipv4 const &amp;a1, ipv4 const &amp;a2) noexcept\r\n    {\r\n        return a1.data == a2.data;\r\n    }\r\n    friend bool operator!=(ipv4 const &amp;a1, ipv4 const &amp;a2) noexcept { return !(a1 == a2); }\r\n    friend bool operator&lt;(ipv4 const &amp;a1, ipv4 const &amp;a2) noexcept\r\n    {\r\n        return a1.to_ulong() &lt; a2.to_ulong();\r\n    }\r\n    friend bool operator&gt;(ipv4 const &amp;a1, ipv4 const &amp;a2) noexcept { return a2 &lt; a1; }\r\n    friend bool operator&lt;=(ipv4 const &amp;a1, ipv4 const &amp;a2) noexcept { return !(a1 &gt; a2); }\r\n    friend bool operator&gt;=(ipv4 const &amp;a1, ipv4 const &amp;a2) noexcept { return !(a1 &lt; a2); }\r\n\r\n    ipv4 &amp;operator+(int i)\r\n    {\r\n        \/\/cout &lt;&lt; \"adding\" &lt;&lt; i &lt;&lt; endl;\r\n        *this = ipv4(i + to_ulong());\r\n        return *this;\r\n    }\r\n};\r\n\r\nint main()\r\n{\r\n\r\n    ipv4 address(168, 192, 0, 1);\r\n    std::cout &lt;&lt; address &lt;&lt; std::endl;\r\n    ipv4 ip;\r\n    std::cout &lt;&lt; ip &lt;&lt; std::endl;\r\n    std::cin &gt;&gt; ip;\r\n\r\n    string test_ip = ip.to_string();\r\n\r\n    if (!std::cin.fail())\r\n        std::cout &lt;&lt; ip &lt;&lt; std::endl;\r\n\r\n    cout &lt;&lt; \"IP: \" &lt;&lt; test_ip &lt;&lt; endl;\r\n    cout &lt;&lt; \"Next IP: \" &lt;&lt; ip++ &lt;&lt; endl;\r\n    cout &lt;&lt; \"Next 5th IP: \" &lt;&lt; ip + 5 &lt;&lt; endl;\r\n    return 0;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #00ff00;\">Hope this helps and good luck.<\/span><\/p>\n<p><span style=\"color: #00ff00;\">&#8212; Saeed \ud83d\ude42<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello, The class below is one way to implement a class that can read IP address from user&#8217;s input in C++; Can convert to string or\/and enumerate in range:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,4,1],"tags":[],"class_list":["post-477","post","type-post","status-publish","format-standard","hentry","category-c","category-programming","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/ghiassy.net\/index.php?rest_route=\/wp\/v2\/posts\/477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ghiassy.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ghiassy.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ghiassy.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ghiassy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=477"}],"version-history":[{"count":1,"href":"https:\/\/ghiassy.net\/index.php?rest_route=\/wp\/v2\/posts\/477\/revisions"}],"predecessor-version":[{"id":478,"href":"https:\/\/ghiassy.net\/index.php?rest_route=\/wp\/v2\/posts\/477\/revisions\/478"}],"wp:attachment":[{"href":"https:\/\/ghiassy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ghiassy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ghiassy.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}