]> git.stg.codes - stg.git/blobdiff - include/stg/user_ips.h
Replace STG::ARRAY with std::array.
[stg.git] / include / stg / user_ips.h
index 264b58960ac2df91e5fa59d991b5583219a8a98a..ee227e5d8c67a0ce3eef09990b246594a98e99b5 100644 (file)
 #ifndef USER_IPS_H
 #define USER_IPS_H
 
+#include "stg/common.h"
+
+#include <cstring>
+#include <cstdint>
+#include <vector>
+#include <string>
+#include <iostream>
+
 #ifdef FREE_BSD
 #include <sys/types.h>
 #endif
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
-#include <cstring>
-#include <vector>
-#include <string>
-#include <iostream>
-#include <sstream>
-
-#include "stg/common.h"
-#include "os_int.h"
-
 //-------------------------------------------------------------------------
 struct IP_MASK
 {
 IP_MASK() : ip(0), mask(0) {}
-IP_MASK(const IP_MASK & ipm) : ip(ipm.ip), mask(ipm.mask)  {}
 uint32_t ip;
 uint32_t mask;
 };
@@ -56,23 +54,19 @@ uint32_t mask;
 class USER_IPS
 {
     friend std::ostream & operator<< (std::ostream & o, const USER_IPS & i);
-    //friend stringstream & operator<< (stringstream & s, const USER_IPS & i);
     friend const USER_IPS StrToIPS(const std::string & ipsStr);
 
 public:
     typedef std::vector<IP_MASK> ContainerType;
     typedef ContainerType::size_type IndexType;
 
-    USER_IPS();
-    USER_IPS(const USER_IPS &);
-    USER_IPS & operator=(const USER_IPS &);
-    const IP_MASK & operator[](IndexType idx) const;
+    const IP_MASK & operator[](IndexType idx) const { return ips[idx]; }
     std::string GetIpStr() const;
     bool IsIPInIPS(uint32_t ip) const;
     bool OnlyOneIP() const;
-    size_t  Count() const;
-    void Add(const IP_MASK &im);
-    void Erase();
+    bool IsAnyIP() const;
+    size_t Count() const { return ips.size(); }
+    void Add(const IP_MASK &im) { ips.push_back(im); }
 
 private:
     uint32_t CalcMask(unsigned int msk) const;
@@ -80,58 +74,21 @@ private:
 };
 //-------------------------------------------------------------------------
 
-//-----------------------------------------------------------------------------
-inline
-USER_IPS::USER_IPS()
-    : ips()
-{}
-//-----------------------------------------------------------------------------
-inline
-USER_IPS::USER_IPS(const USER_IPS & i)
-    : ips(i.ips)
-{}
-//-----------------------------------------------------------------------------
-inline
-USER_IPS & USER_IPS::operator=(const USER_IPS & i)
-{
-ips = i.ips;
-return *this;
-}
-//-----------------------------------------------------------------------------
-inline
-const IP_MASK & USER_IPS::operator[](IndexType idx) const
-{
-return ips[idx];
-}
-//-----------------------------------------------------------------------------
 inline
 std::string USER_IPS::GetIpStr() const
 {
 if (ips.empty())
-    {
     return "";
-    }
 
 if (ips[0].ip == 0)
-    {
     return "*";
-    }
 
 ContainerType::const_iterator it(ips.begin());
-std::ostringstream s;
-s << inet_ntostring(it->ip);
+std::string res = inet_ntostring(it->ip);
 ++it;
 for (; it != ips.end(); ++it)
-    {
-    s << "," << inet_ntostring(it->ip);
-    }
-return s.str();
-}
-//-----------------------------------------------------------------------------
-inline
-size_t USER_IPS::Count() const
-{
-return ips.size();
+    res += "," + inet_ntostring(it->ip);
+return res;
 }
 //-----------------------------------------------------------------------------
 inline
@@ -146,9 +103,7 @@ inline
 bool USER_IPS::IsIPInIPS(uint32_t ip) const
 {
 if (ips.empty())
-    {
     return false;
-    }
 
 if (ips.front().ip == 0)
     return true;
@@ -165,22 +120,16 @@ return false;
 inline
 bool USER_IPS::OnlyOneIP() const
 {
-if (ips.size() == 1 && ips.front().mask == 32)
+if (ips.size() == 1 && ips.front().mask == 32 && ips.front().ip != 0)
     return true;
 
 return false;
 }
 //-----------------------------------------------------------------------------
 inline
-void USER_IPS::Add(const IP_MASK &im)
-{
-ips.push_back(im);
-}
-//-----------------------------------------------------------------------------
-inline
-void USER_IPS::Erase()
+bool USER_IPS::IsAnyIP() const
 {
-ips.erase(ips.begin(), ips.end());
+    return !ips.empty() && ips.front().ip == 0;
 }
 //-----------------------------------------------------------------------------
 inline
@@ -189,36 +138,24 @@ std::ostream & operator<<(std::ostream & o, const USER_IPS & i)
 return o << i.GetIpStr();
 }
 //-----------------------------------------------------------------------------
-/*inline
-stringstream & operator<<(std::stringstream & s, const USER_IPS & i)
-{
-s << i.GetIpStr();
-return s;
-}*/
-//-----------------------------------------------------------------------------
 inline
 const USER_IPS StrToIPS(const std::string & ipsStr)
 {
 USER_IPS ips;
-char * paddr;
-IP_MASK im;
 std::vector<std::string> ipMask;
 if (ipsStr.empty())
-    {
     return ips;
-    }
 
 if (ipsStr[0] == '*' && ipsStr.size() == 1)
     {
-    im.ip = 0;
-    im.mask = 0;
-    ips.ips.push_back(im);
+    ips.ips.push_back(IP_MASK());
     return ips;
     }
 
 char * tmp = new char[ipsStr.size() + 1];
 strcpy(tmp, ipsStr.c_str());
 char * pstr = tmp;
+char * paddr = NULL;
 while ((paddr = strtok(pstr, ",")))
     {
     pstr = NULL;
@@ -235,36 +172,28 @@ for (USER_IPS::IndexType i = 0; i < ipMask.size(); i++)
     strcpy(str, ipMask[i].c_str());
     strIp = strtok(str, "/");
     if (strIp == NULL)
-        {
         return ips;
-        }
     strMask = strtok(NULL, "/");
 
+    IP_MASK im;
+
     im.ip = inet_addr(strIp);
     if (im.ip == INADDR_NONE)
-        {
         return ips;
-        }
 
     im.mask = 32;
     if (strMask != NULL)
         {
         int m = 0;
         if (str2x(strMask, m) != 0)
-            {
             return ips;
-            }
         im.mask = m;
 
         if (im.mask > 32)
-            {
             return ips;
-            }
 
         if ((im.ip & ips.CalcMask(im.mask)) != im.ip)
-            {
             return ips;
-            }
         }
     ips.ips.push_back(im);
     }