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);