libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
numname.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <promeki/namespace.h>
14#include <promeki/string.h>
15
16PROMEKI_NAMESPACE_BEGIN
17
26class NumName {
27 public:
34 static NumName parse(const String &str, int *val = nullptr);
35
61 static NumName fromMask(const String &mask);
62
64 NumName() = default;
65
73 NumName(const String &prefix, const String &suffix, int digits, bool padded)
74 : px(prefix), sx(suffix), dl(digits), pad(padded) {}
75
80 NumName(const String &str) { *this = parse(str); }
81
86 bool isValid() const { return dl > 0; }
87
93 String name(int val) const { return px + String::number(val, 10, pad ? dl : 0, '0') + sx; }
94
99 String prefix() const { return px; }
100
105 String suffix() const { return sx; }
106
111 bool isPadded() const { return pad; }
112
117 int digits() const { return dl; }
118
127 String filemask() const {
128 String mask;
129 if (pad) {
130 mask = "%0";
131 mask += String::number(dl);
132 mask += 'd';
133 } else {
134 mask = "%d";
135 }
136 return px + mask + sx;
137 }
138
147 String hashmask() const { return px + String(pad ? dl : 1, '#') + sx; }
148
150 bool operator==(const NumName &other) const {
151 return dl == other.dl && pad == other.pad && px == other.px && sx == other.sx;
152 }
153
155 bool operator!=(const NumName &other) const { return !(*this == other); }
156
166 bool isInSequence(const NumName &n) const {
167 if (!n.isValid() || n.px != px || n.sx != sx) return false;
168 if (n.pad && !pad && n.dl > dl) return false;
169 if (!n.pad && pad && dl > n.dl) return false;
170 if (n.pad && pad && n.dl != dl) return false;
171 return true;
172 }
173
174 private:
175 String px; // Prefix
176 String sx; // Suffix
177 int dl = 0; // Digit length
178 bool pad = false; // Padding
179};
180
181PROMEKI_NAMESPACE_END
182
183#endif // PROMEKI_ENABLE_CORE