2
0

CModVersion.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * CModVersion.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "CModVersion.h"
  12. VCMI_LIB_NAMESPACE_BEGIN
  13. CModVersion CModVersion::GameVersion()
  14. {
  15. return CModVersion(VCMI_VERSION_MAJOR, VCMI_VERSION_MINOR, VCMI_VERSION_PATCH);
  16. }
  17. CModVersion CModVersion::fromString(const std::string & from)
  18. {
  19. std::vector<std::string> segments;
  20. boost::split(segments, from, boost::is_any_of("."));
  21. if (from.empty())
  22. return CModVersion();
  23. if (segments.size() > 3)
  24. return CModVersion();
  25. static const std::string whitelist = "1234567890.";
  26. for (const auto & ch : from)
  27. if (whitelist.find(ch) == std::string::npos)
  28. return CModVersion();
  29. try
  30. {
  31. int major = Any;
  32. int minor = Any;
  33. int patch = Any;
  34. major = std::stoi(segments[0]);
  35. if (segments.size() > 1)
  36. minor = std::stoi(segments[1]);
  37. if (segments.size() > 2)
  38. patch = std::stoi(segments[2]);
  39. return CModVersion(major, minor, patch);
  40. }
  41. catch(const std::logic_error &)
  42. {
  43. return CModVersion();
  44. }
  45. }
  46. std::string CModVersion::toString() const
  47. {
  48. std::string res;
  49. if(major != Any)
  50. {
  51. res += std::to_string(major);
  52. if(minor != Any)
  53. {
  54. res += '.' + std::to_string(minor);
  55. if(patch != Any)
  56. res += '.' + std::to_string(patch);
  57. }
  58. }
  59. return res;
  60. }
  61. bool CModVersion::operator ==(const CModVersion & other) const
  62. {
  63. return major == other.major && minor == other.minor && patch == other.patch;
  64. }
  65. bool CModVersion::operator !=(const CModVersion & other) const
  66. {
  67. return major != other.major || minor != other.minor || patch != other.patch;
  68. }
  69. bool CModVersion::compatible(const CModVersion & other, bool checkMinor, bool checkPatch) const
  70. {
  71. bool doCheckMinor = checkMinor && minor != Any && other.minor != Any;
  72. bool doCheckPatch = checkPatch && patch != Any && other.patch != Any;
  73. assert(!doCheckPatch || (doCheckPatch && doCheckMinor));
  74. return (major == other.major &&
  75. (!doCheckMinor || minor >= other.minor) &&
  76. (!doCheckPatch || minor > other.minor || (minor == other.minor && patch >= other.patch)));
  77. }
  78. bool CModVersion::isNull() const
  79. {
  80. return major == Any;
  81. }
  82. bool operator < (const CModVersion & lesser, const CModVersion & greater)
  83. {
  84. //specific is "greater" than non-specific, that's why do not check for Any value
  85. if(lesser.major == greater.major)
  86. {
  87. if(lesser.minor == greater.minor)
  88. return lesser.patch < greater.patch;
  89. return lesser.minor < greater.minor;
  90. }
  91. return lesser.major < greater.major;
  92. }
  93. VCMI_LIB_NAMESPACE_END