35 return std::make_unique<Int>(i);
45 return std::make_unique<Real>(d);
55 return CloneAs<String>(str);
65 return CloneAs<StringUTF8>(str);
75 return CloneAs<Path>(str);
85 return CloneAs<Prop3>(val);
88 static const auto asciiOffset = 33;
89 static const auto pow85 = std::vector<unsigned int>{ 85*85*85*85, 85*85*85, 85*85, 85, 1 };
90 static void encodeBlock(
size_t count,
unsigned int &_tuple,
StringUTF8 &s)
92 auto block = std::array<uint8_t, 5>{};
93 for (
auto it = block.rbegin(); it != block.rend(); ++it)
95 *it = uint8_t((_tuple % 85) + asciiOffset);
98 for (
auto i =
size_t(0); i < count; ++i)
115 for (
auto tmp =
size_t(0); tmp < len; ++tmp)
123 encodeBlock(
size_t(5), _tuple, s);
129 _tuple |= (data[tmp] << (24 - (count * 8)));
135 encodeBlock(
size_t(count + 1), _tuple, s);
148 auto data = std::vector<uint8_t>{};
150 auto processChar =
false;
151 auto block = std::array<uint8_t, 4>{};
156 const auto c = s[tmp];
162 std::fill(block.begin(), block.end(), 0);
163 data.insert(data.end(), block.begin(), block.end());
166 case '\n':
case '\r':
case '\t':
case '\0':
case '\f':
case '\b':
170 if (c < '!' || c >
'u')
178 _tuple += (c - asciiOffset) * pow85[count];
183 block[i] = uint8_t(_tuple >> (24 - (
int(i) * 8)));
184 data.insert(data.end(), block.begin(), block.end());
196 _tuple += pow85[count];
197 for (
auto i = 0; i < count; ++i)
198 block[i] = uint8_t(_tuple >> (24 - (i * 8)));
199 data.insert(data.end(), block.begin(), block.begin() + count);
ScalarRange< T > Range(T b, T e)
Creates a range [[b, e[[.
A UTF32 character string class.
UInt ToCRN(int i)
Converts an int to CRN data.
A convenience class for file paths.
std::vector< uint8_t > ASCII85Decode(const crn::StringUTF8 &s)
Decodes an ASCII85 string to a vector of bytes.
A character string class.
crn::StringUTF8 ASCII85Encode(const uint8_t *const data, size_t len)
Encodes any data into a printable string.
Invalid argument error (e.g.: nullptr pointer)