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.templates;
27 
28 /**
29  *  Template for immutable boxed values.
30  *  
31  *  This template can be used to have a handy object representation of a primitive value or aggregate,
32  *  but the use of derived classes instead of the unboxed types is discouraged as you should use them the least time possible.
33  */
34 abstract class Boxed(T)
35 {
36     private T value;
37 
38     /**
39      *  Ctor.
40      */
41     this(T value)
42     {
43         this.value = value;
44     }
45 
46     /**
47      *  Returns: the wrapped value.
48      */
49     public T getValue()
50     {
51         return this.value;
52     }
53 }
54 
55 /**
56  * Mixin for boxed values. It provides the unified AliasThis implementation.
57  */
58 mixin template BoxedAlias()
59 {
60     alias getValue this;
61 }