fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <limits>
  5.  
  6. template <typename T>
  7. std::string mx(T e) {
  8. std::vector<T> v;
  9. return std::to_string(v.max_size());
  10. }
  11.  
  12. std::size_t maxColWidth(std::vector<std::string> v) {
  13. std::size_t maxWidth = 0;
  14.  
  15. for (const auto &s: v)
  16. if (s.length() > maxWidth)
  17. maxWidth = s.length();
  18.  
  19. // Add 2 for space on each side
  20. return maxWidth + 2;
  21. }
  22.  
  23. constexpr long double maxStdSize_t = std::numeric_limits<std::size_t>::max();
  24.  
  25. // cs stands for compared to std::size_t
  26. template <typename T>
  27. std::string cs(T e) {
  28. std::vector<T> v;
  29. long double maxSize = v.max_size();
  30. long double quotient = maxStdSize_t / maxSize;
  31. return std::to_string(quotient);
  32. }
  33.  
  34. int main() {
  35. bool v0 = 0;
  36. char v1 = 0;
  37.  
  38. int8_t v2 = 0;
  39. int16_t v3 = 0;
  40. int32_t v4 = 0;
  41. int64_t v5 = 0;
  42.  
  43. uint8_t v6 = 0;
  44. uint16_t v7 = 0;
  45. uint32_t v8 = 0;
  46. uint64_t v9 = 0;
  47.  
  48. std::size_t v10 = 0;
  49. double v11 = 0;
  50. long double v12 = 0;
  51.  
  52. std::vector<std::string> types = {"data types", "bool", "char", "int8_t", "int16_t",
  53. "int32_t", "int64_t", "uint8_t", "uint16_t",
  54. "uint32_t", "uint64_t", "size_t", "double",
  55. "long double"};
  56.  
  57. std::vector<std::string> sizes = {"approx max array length", mx(v0), mx(v1), mx(v2),
  58. mx(v3), mx(v4), mx(v5), mx(v6), mx(v7), mx(v8),
  59. mx(v9), mx(v10), mx(v11), mx(v12)};
  60.  
  61. std::vector<std::string> quotients = {"max std::size_t / max array size", cs(v0),
  62. cs(v1), cs(v2), cs(v3), cs(v4), cs(v5), cs(v6),
  63. cs(v7), cs(v8), cs(v9), cs(v10), cs(v11), cs(v12)};
  64.  
  65. std::size_t max1 = maxColWidth(types);
  66. std::size_t max2 = maxColWidth(sizes);
  67. std::size_t max3 = maxColWidth(quotients);
  68.  
  69. for (std::size_t i = 0; i < types.size(); ++i) {
  70. while (types[i].length() < (max1 - 1)) {
  71. types[i] = " " + types[i];
  72. }
  73.  
  74. types[i] += " ";
  75.  
  76. for (int j = 0; sizes[i].length() < max2; ++j)
  77. sizes[i] = (j % 2 == 0) ? " " + sizes[i] : sizes[i] + " ";
  78.  
  79. for (int j = 0; quotients[i].length() < max3; ++j)
  80. quotients[i] = (j % 2 == 0) ? " " + quotients[i] : quotients[i] + " ";
  81.  
  82. std::cout << "|" << types[i] << "|" << sizes[i] << "|" << quotients[i] << "|\n";
  83. }
  84.  
  85. std::cout << std::endl;
  86.  
  87. std::cout << "N.B. max std::size_t is: " <<
  88. std::numeric_limits<std::size_t>::max() << std::endl;
  89.  
  90. return 0;
  91. }
  92.  
Success #stdin #stdout 0s 4304KB
stdin
Standard input is empty
stdout
|  data types | approx max array length | max std::size_t / max array size |
|        bool |   9223372036854775744   |             2.000000             |
|        char |   18446744073709551615  |             1.000000             |
|      int8_t |   18446744073709551615  |             1.000000             |
|     int16_t |   9223372036854775807   |             2.000000             |
|     int32_t |   4611686018427387903   |             4.000000             |
|     int64_t |   2305843009213693951   |             8.000000             |
|     uint8_t |   18446744073709551615  |             1.000000             |
|    uint16_t |   9223372036854775807   |             2.000000             |
|    uint32_t |   4611686018427387903   |             4.000000             |
|    uint64_t |   2305843009213693951   |             8.000000             |
|      size_t |   2305843009213693951   |             8.000000             |
|      double |   2305843009213693951   |             8.000000             |
| long double |   1152921504606846975   |             16.000000            |

N.B. max std::size_t is: 18446744073709551615