cmValue.cxx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "cmValue.h"
  2. #include <string>
  3. #include <cmext/string_view>
  4. #include "cmStringAlgorithms.h"
  5. std::string cmValue::Empty;
  6. bool cmValue::IsOn(cm::string_view value) noexcept
  7. {
  8. switch (value.size()) {
  9. case 1:
  10. return value[0] == '1' || value[0] == 'Y' || value[0] == 'y';
  11. case 2:
  12. return //
  13. (value[0] == 'O' || value[0] == 'o') && //
  14. (value[1] == 'N' || value[1] == 'n');
  15. case 3:
  16. return //
  17. (value[0] == 'Y' || value[0] == 'y') && //
  18. (value[1] == 'E' || value[1] == 'e') && //
  19. (value[2] == 'S' || value[2] == 's');
  20. case 4:
  21. return //
  22. (value[0] == 'T' || value[0] == 't') && //
  23. (value[1] == 'R' || value[1] == 'r') && //
  24. (value[2] == 'U' || value[2] == 'u') && //
  25. (value[3] == 'E' || value[3] == 'e');
  26. default:
  27. break;
  28. }
  29. return false;
  30. }
  31. bool cmValue::IsOff(cm::string_view value) noexcept
  32. {
  33. switch (value.size()) {
  34. case 0:
  35. return true;
  36. case 1:
  37. return value[0] == '0' || value[0] == 'N' || value[0] == 'n';
  38. case 2:
  39. return //
  40. (value[0] == 'N' || value[0] == 'n') && //
  41. (value[1] == 'O' || value[1] == 'o');
  42. case 3:
  43. return //
  44. (value[0] == 'O' || value[0] == 'o') && //
  45. (value[1] == 'F' || value[1] == 'f') && //
  46. (value[2] == 'F' || value[2] == 'f');
  47. case 5:
  48. return //
  49. (value[0] == 'F' || value[0] == 'f') && //
  50. (value[1] == 'A' || value[1] == 'a') && //
  51. (value[2] == 'L' || value[2] == 'l') && //
  52. (value[3] == 'S' || value[3] == 's') && //
  53. (value[4] == 'E' || value[4] == 'e');
  54. case 6:
  55. return //
  56. (value[0] == 'I' || value[0] == 'i') && //
  57. (value[1] == 'G' || value[1] == 'g') && //
  58. (value[2] == 'N' || value[2] == 'n') && //
  59. (value[3] == 'O' || value[3] == 'o') && //
  60. (value[4] == 'R' || value[4] == 'r') && //
  61. (value[5] == 'E' || value[5] == 'e');
  62. default:
  63. break;
  64. }
  65. return IsNOTFOUND(value);
  66. }
  67. bool cmValue::IsNOTFOUND(cm::string_view value) noexcept
  68. {
  69. return (value == "NOTFOUND"_s) || cmHasSuffix(value, "-NOTFOUND"_s);
  70. }
  71. bool cmValue::IsInternallyOn(cm::string_view value) noexcept
  72. {
  73. return (value.size() == 4) && //
  74. (value[0] == 'I' || value[0] == 'i') && //
  75. (value[1] == '_') && //
  76. (value[2] == 'O' || value[2] == 'o') && //
  77. (value[3] == 'N' || value[3] == 'n');
  78. }
  79. int cmValue::Compare(cmValue value) const noexcept
  80. {
  81. if (this->Value == nullptr && !value) {
  82. return 0;
  83. }
  84. if (this->Value == nullptr) {
  85. return -1;
  86. }
  87. if (!value) {
  88. return 1;
  89. }
  90. return this->Value->compare(*value);
  91. }
  92. int cmValue::Compare(cm::string_view value) const noexcept
  93. {
  94. if (this->Value == nullptr && value.data() == nullptr) {
  95. return 0;
  96. }
  97. if (this->Value == nullptr) {
  98. return -1;
  99. }
  100. if (value.data() == nullptr) {
  101. return 1;
  102. }
  103. return cm::string_view(*this->Value).compare(value);
  104. }
  105. std::ostream& operator<<(std::ostream& o, cmValue v)
  106. {
  107. o << *v;
  108. return o;
  109. }