1 /** 
2  *  Authors: Alex 'asperan' Speranza, alex.speranza@studio.unibo.it
3  *  License: 
4  *  MIT License
5  *  
6  *  Copyright (c) 2021 Alex Speranza
7  *  
8  *  Permission is hereby granted, free of charge, to any person obtaining a copy
9  *  of this software and associated documentation files (the "Software"), to deal
10  *  in the Software without restriction, including without limitation the rights
11  *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  *  copies of the Software, and to permit persons to whom the Software is
13  *  furnished to do so, subject to the following conditions:
14  *  
15  *  The above copyright notice and this permission notice shall be included in all
16  *  copies or substantial portions of the Software.
17  *  
18  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21  *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24  *  SOFTWARE.
25  */
26 module boxed.bools;
27 
28 import boxed.templates;
29 
30 /**
31  *  Boxed boolean value.
32  *
33  *  When using this class alone, always use <object>.getValue to avoid the null-reference check.
34  *  
35  *  When the class is used as a boolean argument, the AliasThis kicks in.
36  *  
37  *  Examples:
38  *  ```
39  *  BoxedBool bb = new BoxedBool(false);
40  *
41  *  void testFalse(bool value)
42  *  {
43  *      assert(!value);
44  *  }
45  *
46  *  if (bb) // null-reference check, it will always fail. Use bb.getValue in this case.
47  *  {
48  *      assert(false);
49  *  }
50  *  else
51  *  {
52  *      assert(true);
53  *  }
54  *
55  *  testFalse(bb); // bb is treated as a bool, it won't fail this way.
56  *  ```
57  */
58 class BoxedBool : Boxed!bool
59 {
60     /**
61      *  Ctor.
62      */
63     this(bool value)
64     {
65         super(value);
66     }
67 
68     mixin BoxedAlias;
69 }
70 
71 unittest
72 {
73     BoxedBool bb = new BoxedBool(false);
74     assert(!bb.getValue);
75 
76     void testFalse(bool value)
77     {
78         assert(!value);
79     }
80 
81     testFalse(bb);
82 }