]> git.stg.codes - stg.git/blob - include/stg/tariff.h
Target-specific, compiler-aware warnings.
[stg.git] / include / stg / tariff.h
1 /*
2  *    This program is free software; you can redistribute it and/or modify
3  *    it under the terms of the GNU General Public License as published by
4  *    the Free Software Foundation; either version 2 of the License, or
5  *    (at your option) any later version.
6  *
7  *    This program is distributed in the hope that it will be useful,
8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *    GNU General Public License for more details.
11  *
12  *    You should have received a copy of the GNU General Public License
13  *    along with this program; if not, write to the Free Software
14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 /*
18  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
19  */
20
21 #ifndef TARIFF_H
22 #define TARIFF_H
23
24 #include <string>
25 #include <istream>
26 #include <cstring>
27 #include <ctime>
28 #include <cstdint>
29
30 struct TARIFF_DATA;
31
32 class TARIFF {
33 public:
34     enum CHANGE_POLICY { ALLOW = 0, TO_CHEAP, TO_EXPENSIVE, DENY };
35
36     enum PERIOD { DAY = 0, MONTH };
37
38     enum TRAFF_TYPE { TRAFF_UP = 0, TRAFF_DOWN, TRAFF_UP_DOWN, TRAFF_MAX };
39
40     static std::string ChangePolicyToString(CHANGE_POLICY changePolicy);
41     static CHANGE_POLICY StringToChangePolicy(const std::string& value);
42
43     static std::string PeriodToString(PERIOD period);
44     static PERIOD StringToPeriod(const std::string& value);
45
46     static std::string TraffTypeToString(TRAFF_TYPE type);
47     static TRAFF_TYPE StringToTraffType(const std::string& value);
48     static TRAFF_TYPE IntToTraffType(int value);
49
50     virtual ~TARIFF() {}
51     virtual double  GetPriceWithTraffType(uint64_t up,
52                                           uint64_t down,
53                                           int dir,
54                                           time_t t) const = 0;
55     virtual double  GetFreeMb() const = 0;
56     virtual double  GetPassiveCost() const = 0;
57     virtual double  GetFee() const = 0;
58     virtual double  GetFree() const = 0;
59     virtual PERIOD  GetPeriod() const = 0;
60     virtual CHANGE_POLICY GetChangePolicy() const = 0;
61     virtual time_t  GetChangePolicyTimeout() const = 0;
62
63     virtual const   std::string & GetName() const = 0;
64     virtual void    SetName(const std::string & name) = 0;
65
66     virtual int     GetTraffType() const = 0;
67     virtual int64_t GetTraffByType(uint64_t up, uint64_t down) const = 0;
68     virtual int     GetThreshold(int dir) const = 0;
69     virtual const TARIFF_DATA & GetTariffData() const = 0;
70     virtual std::string TariffChangeIsAllowed(const TARIFF & to, time_t currentTime) const = 0;
71 };
72
73 inline
74 std::string TARIFF::ChangePolicyToString(TARIFF::CHANGE_POLICY changePolicy)
75 {
76 switch (changePolicy)
77     {
78     case ALLOW: return "allow";
79     case TO_CHEAP: return "to_cheap";
80     case TO_EXPENSIVE: return "to_expensive";
81     case DENY: return "deny";
82     }
83 return "allow"; // Classic behaviour.
84 }
85
86 inline
87 TARIFF::CHANGE_POLICY TARIFF::StringToChangePolicy(const std::string& value)
88 {
89 if (strcasecmp(value.c_str(), "to_cheap") == 0)
90     return TO_CHEAP;
91 if (strcasecmp(value.c_str(), "to_expensive") == 0)
92     return TO_EXPENSIVE;
93 if (strcasecmp(value.c_str(), "deny") == 0)
94     return DENY;
95 return ALLOW; // Classic behaviour.
96 }
97
98 inline
99 std::string TARIFF::PeriodToString(TARIFF::PERIOD period)
100 {
101 switch (period)
102     {
103     case DAY: return "day";
104     case MONTH: return "month";
105     }
106 return "month"; // Classic behaviour.
107 }
108
109 inline
110 TARIFF::PERIOD TARIFF::StringToPeriod(const std::string& value)
111 {
112 if (strcasecmp(value.c_str(), "day") == 0)
113     return DAY;
114 return MONTH; // Classic behaviour.
115 }
116
117 inline
118 std::string TARIFF::TraffTypeToString(TARIFF::TRAFF_TYPE type)
119 {
120 switch (type)
121     {
122     case TRAFF_UP: return "up";
123     case TRAFF_DOWN: return "down";
124     case TRAFF_UP_DOWN: return "up+down";
125     case TRAFF_MAX: return "max";
126     }
127 return "up+down";
128 }
129
130 inline
131 TARIFF::TRAFF_TYPE TARIFF::StringToTraffType(const std::string& value)
132 {
133 if (strcasecmp(value.c_str(), "up") == 0)
134     return TRAFF_UP;
135 if (strcasecmp(value.c_str(), "down") == 0)
136     return TRAFF_DOWN;
137 if (strcasecmp(value.c_str(), "up+down") == 0)
138     return TRAFF_UP_DOWN;
139 if (strcasecmp(value.c_str(), "max") == 0)
140     return TRAFF_MAX;
141 return TRAFF_UP_DOWN;
142 }
143
144 inline
145 std::istream & operator>>(std::istream & stream, TARIFF::TRAFF_TYPE & traffType)
146 {
147     unsigned val;
148     stream >> val;
149     traffType = static_cast<TARIFF::TRAFF_TYPE>(val);
150     return stream;
151 }
152
153 inline
154 TARIFF::TRAFF_TYPE TARIFF::IntToTraffType(int value)
155 {
156     if (value < 0 || value > TRAFF_MAX)
157         return TRAFF_UP_DOWN;
158     return static_cast<TRAFF_TYPE>(value);
159 }
160
161 #endif