1 /+ 2 + Copyright 2023 – 2024 Aya Partridge 3 + Distributed under the Boost Software License, Version 1.0. 4 + (See accompanying file LICENSE_1_0.txt or copy at 5 + http://www.boost.org/LICENSE_1_0.txt) 6 +/ 7 module bindbc.common.versions; 8 9 struct Version{ 10 int major; 11 int minor; 12 int patch; 13 14 enum none = Version(int.min, 0, 0); 15 enum bad = Version(-1, 0, 0); 16 17 int opCmp(Version x) const nothrow @nogc pure @safe{ 18 if(major != x.major){ 19 return major - x.major; 20 }else if(minor != x.minor){ 21 return minor - x.minor; 22 }else{ 23 return patch - x.patch; 24 } 25 } 26 unittest{ 27 assert(Version(0,1,0) > Version(0,0,57)); 28 assert(Version(0,4,0) == Version(0,4,0)); 29 assert(Version(0,40,80) < Version(1,0,0)); 30 } 31 32 Version opBinary(string op: "+")(Version rhs) const nothrow @nogc pure @safe 33 in(rhs.major >= 0 && rhs.minor >= 0 && rhs.patch >= 0, "Cannot perform addition with negative version numbers."){ 34 if(rhs.major > 0){ 35 return Version(major + rhs.major, rhs.minor, rhs.patch); 36 }else if(rhs.minor > 0){ 37 return Version(major, minor + rhs.minor, rhs.patch); 38 }else{ 39 return Version(major, minor, patch + rhs.patch); 40 } 41 } 42 unittest{ 43 assert(Version(0,5,7) + Version(0,1,0) == Version(0,6,0)); 44 assert(Version(0,5,7) + Version(0,1,1) == Version(0,6,1)); 45 assert(Version(1,5,7) + Version(1,0,0) == Version(2,0,0)); 46 assert(Version(1,5,7) + Version(1,3,4) == Version(2,3,4)); 47 } 48 49 bool opCast(T: bool)() const nothrow @nogc pure @safe{ 50 return this != none && this != bad; 51 } 52 } 53 54 ///The current package version. 55 package enum bindBCCommonVersion = Version(1,0,0);