#include <iostream>
#include <vector>
#include <string>
#include <limits>
template <typename T>
std::string mx(T e) {
std::vector<T> v;
return std::to_string(v.max_size());
}
std::size_t maxColWidth(std::vector<std::string> v) {
std::size_t maxWidth = 0;
for (const auto &s: v)
if (s.length() > maxWidth)
maxWidth = s.length();
// Add 2 for space on each side
return maxWidth + 2;
}
constexpr long double maxStdSize_t = std::numeric_limits<std::size_t>::max();
// cs stands for compared to std::size_t
template <typename T>
std::string cs(T e) {
std::vector<T> v;
long double maxSize = v.max_size();
long double quotient = maxStdSize_t / maxSize;
return std::to_string(quotient);
}
int main() {
bool v0 = 0;
char v1 = 0;
int8_t v2 = 0;
int16_t v3 = 0;
int32_t v4 = 0;
int64_t v5 = 0;
uint8_t v6 = 0;
uint16_t v7 = 0;
uint32_t v8 = 0;
uint64_t v9 = 0;
std::size_t v10 = 0;
double v11 = 0;
long double v12 = 0;
std::vector<std::string> types = {"data types", "bool", "char", "int8_t", "int16_t",
"int32_t", "int64_t", "uint8_t", "uint16_t",
"uint32_t", "uint64_t", "size_t", "double",
"long double"};
std::vector<std::string> sizes = {"approx max array length", mx(v0), mx(v1), mx(v2),
mx(v3), mx(v4), mx(v5), mx(v6), mx(v7), mx(v8),
mx(v9), mx(v10), mx(v11), mx(v12)};
std::vector<std::string> quotients = {"max std::size_t / max array size", cs(v0),
cs(v1), cs(v2), cs(v3), cs(v4), cs(v5), cs(v6),
cs(v7), cs(v8), cs(v9), cs(v10), cs(v11), cs(v12)};
std::size_t max1 = maxColWidth(types);
std::size_t max2 = maxColWidth(sizes);
std::size_t max3 = maxColWidth(quotients);
for (std::size_t i = 0; i < types.size(); ++i) {
while (types[i].length() < (max1 - 1)) {
types[i] = " " + types[i];
}
types[i] += " ";
for (int j = 0; sizes[i].length() < max2; ++j)
sizes[i] = (j % 2 == 0) ? " " + sizes[i] : sizes[i] + " ";
for (int j = 0; quotients[i].length() < max3; ++j)
quotients[i] = (j % 2 == 0) ? " " + quotients[i] : quotients[i] + " ";
std::cout << "|" << types[i] << "|" << sizes[i] << "|" << quotients[i] << "|\n";
}
std::cout << std::endl;
std::cout << "N.B. max std::size_t is: " <<
std::numeric_limits<std::size_t>::max() << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bGltaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0ZDo6c3RyaW5nIG14KFQgZSkgewogICAgc3RkOjp2ZWN0b3I8VD4gdjsKICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyh2Lm1heF9zaXplKCkpOwp9CgpzdGQ6OnNpemVfdCBtYXhDb2xXaWR0aChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdikgewogICAgc3RkOjpzaXplX3QgbWF4V2lkdGggPSAwOwogICAgCiAgICBmb3IgKGNvbnN0IGF1dG8gJnM6IHYpCiAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiBtYXhXaWR0aCkKICAgICAgICAgICAgbWF4V2lkdGggPSBzLmxlbmd0aCgpOwogICAgCiAgICAvLyBBZGQgMiBmb3Igc3BhY2Ugb24gZWFjaCBzaWRlCiAgICByZXR1cm4gbWF4V2lkdGggKyAyOwp9Cgpjb25zdGV4cHIgbG9uZyBkb3VibGUgbWF4U3RkU2l6ZV90ID0gc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCgpOwoKLy8gY3Mgc3RhbmRzIGZvciBjb21wYXJlZCB0byBzdGQ6OnNpemVfdAp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RkOjpzdHJpbmcgY3MoVCBlKSB7CiAgICBzdGQ6OnZlY3RvcjxUPiB2OwogICAgbG9uZyBkb3VibGUgbWF4U2l6ZSA9IHYubWF4X3NpemUoKTsKICAgIGxvbmcgZG91YmxlIHF1b3RpZW50ID0gbWF4U3RkU2l6ZV90IC8gbWF4U2l6ZTsKICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyhxdW90aWVudCk7Cn0KCmludCBtYWluKCkgewogICAgYm9vbCB2MCA9IDA7CiAgICBjaGFyIHYxID0gMDsKICAgIAogICAgaW50OF90IHYyID0gMDsKICAgIGludDE2X3QgdjMgPSAwOwogICAgaW50MzJfdCB2NCA9IDA7CiAgICBpbnQ2NF90IHY1ID0gMDsKICAgIAogICAgdWludDhfdCB2NiA9IDA7CiAgICB1aW50MTZfdCB2NyA9IDA7CiAgICB1aW50MzJfdCB2OCA9IDA7CiAgICB1aW50NjRfdCB2OSA9IDA7CiAgICAKICAgIHN0ZDo6c2l6ZV90IHYxMCA9IDA7CiAgICBkb3VibGUgdjExID0gMDsKICAgIGxvbmcgZG91YmxlIHYxMiA9IDA7CiAgICAKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0eXBlcyA9IHsiZGF0YSB0eXBlcyIsICJib29sIiwgImNoYXIiLCAiaW50OF90IiwgImludDE2X3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQzMl90IiwgImludDY0X3QiLCAidWludDhfdCIsICJ1aW50MTZfdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVpbnQzMl90IiwgInVpbnQ2NF90IiwgInNpemVfdCIsICJkb3VibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nIGRvdWJsZSJ9OwogICAgCiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2l6ZXMgPSB7ImFwcHJveCBtYXggYXJyYXkgbGVuZ3RoIiwgbXgodjApLCBteCh2MSksIG14KHYyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXgodjMpLCBteCh2NCksIG14KHY1KSwgbXgodjYpLCBteCh2NyksIG14KHY4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXgodjkpLCBteCh2MTApLCBteCh2MTEpLCBteCh2MTIpfTsKICAgIAogICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHF1b3RpZW50cyA9IHsibWF4IHN0ZDo6c2l6ZV90IC8gbWF4IGFycmF5IHNpemUiLCBjcyh2MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzKHYxKSwgY3ModjIpLCBjcyh2MyksIGNzKHY0KSwgY3ModjUpLCBjcyh2NiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzKHY3KSwgY3ModjgpLCBjcyh2OSksIGNzKHYxMCksIGNzKHYxMSksIGNzKHYxMil9OwogICAgCiAgICBzdGQ6OnNpemVfdCBtYXgxID0gbWF4Q29sV2lkdGgodHlwZXMpOwogICAgc3RkOjpzaXplX3QgbWF4MiA9IG1heENvbFdpZHRoKHNpemVzKTsKICAgIHN0ZDo6c2l6ZV90IG1heDMgPSBtYXhDb2xXaWR0aChxdW90aWVudHMpOwogICAgCiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdHlwZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICB3aGlsZSAodHlwZXNbaV0ubGVuZ3RoKCkgPCAobWF4MSAtIDEpKSB7CiAgICAgICAgICAgIHR5cGVzW2ldID0gIiAiICsgdHlwZXNbaV07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHR5cGVzW2ldICs9ICIgIjsKCiAgICAgICAgZm9yICAoaW50IGogPSAwOyBzaXplc1tpXS5sZW5ndGgoKSA8IG1heDI7ICsraikKICAgICAgICAgICAgc2l6ZXNbaV0gPSAoaiAlIDIgPT0gMCkgPyAiICIgKyBzaXplc1tpXSA6IHNpemVzW2ldICsgIiAiOwogICAgICAgIAogICAgICAgIGZvciAgKGludCBqID0gMDsgcXVvdGllbnRzW2ldLmxlbmd0aCgpIDwgbWF4MzsgKytqKQogICAgICAgICAgICBxdW90aWVudHNbaV0gPSAoaiAlIDIgPT0gMCkgPyAiICIgKyBxdW90aWVudHNbaV0gOiBxdW90aWVudHNbaV0gKyAiICI7CgogICAgICAgIHN0ZDo6Y291dCA8PCAifCIgPDwgdHlwZXNbaV0gPDwgInwiIDw8IHNpemVzW2ldIDw8ICJ8IiA8PCBxdW90aWVudHNbaV0gPDwgInxcbiI7CiAgICB9CgogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgc3RkOjpjb3V0IDw8ICJOLkIuIG1heCBzdGQ6OnNpemVfdCBpczogIiA8PAogICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzaXplX3Q+OjptYXgoKSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgCiAgICByZXR1cm4gMDsKfQo=