Muesli
 All Classes Namespaces Files Functions Typedefs Enumerations
conversion.h
1 /*
2  * conversion.h
3  *
4  * Author:
5  *
6  * -------------------------------------------------------------------------------
7  *
8  * The MIT License
9  *
10  * Copyright 2014 Steffen Ernsting <s.ernsting@uni-muenster.de>,
11  * Herbert Kuchen <kuchen@uni-muenster.de.
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining a copy
14  * of this software and associated documentation files (the "Software"), to deal
15  * in the Software without restriction, including without limitation the rights
16  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17  * copies of the Software, and to permit persons to whom the Software is
18  * furnished to do so, subject to the following conditions:
19  *
20  * The above copyright notice and this permission notice shall be included in
21  * all copies or substantial portions of the Software.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29  * THE SOFTWARE.
30  *
31  */
32 
33 #pragma once
34 
35 namespace msl {
36 
37 namespace detail {
38 
39 // liefert true, wenn U oeffentlich von T erbt oder wenn T und U den gleichen Typ besitzen
40 #define MSL_IS_SUPERCLASS(T, U) (detail::Conversion<const U*, const T*>::exists && !detail::Conversion<const T*, const void*>::sameType)
41 
42 /* MSL_Conversion erkennt zur Compilezeit, ob sich T nach U konvertieren laesst.
43  exists = true, wenn sich T nach U konvertieren laesst, sonst false
44  */
45 template<class T, class U>
47 {
48 
49 private:
50 
51  // sizeof(Small) = 1
52  typedef char Small;
53 
54  // sizeof(Big) > 1
55  class Big
56  {
57  char dummy[2];
58  };
59 
60  // Compiler waehlt diese Funktion, wenn er eine Umwandlung von T nach U findet
61  static Small Test(U);
62  // sonst nimmer er diese
63  static Big Test(...);
64  // Erzeugt ein Objekt vom Typ T, selbst wenn der Konstruktor als private deklariert wurde
65  static T MakeT();
66 
67 public:
68 
69  enum
70  {
71  exists = sizeof(Test(MakeT())) == sizeof(Small)
72  };
73 
74  enum
75  {
76  sameType = false
77  };
78 
79 };
80 
81 /* Überladung von MSL_Conversion, um den Fall T = U zu erkennen
82  */
83 template<class T>
84 class Conversion<T, T>
85 {
86 
87 public:
88 
89  enum
90  {
91  exists = true, sameType = true
92  };
93 
94 };
95 
96 /* MSL_Int2Type erzeugt aus ganzzahligen Konstanten einen eigenen Typ. Wird
97  benoetigt, damit der Compiler zur Compilezeit die korrekte MSL_Send Methode
98  auswaehlen kann.
99  */
100 template<int v>
101 struct Int2Type
102 {
103 
104  enum
105  {
106  value = v
107  };
108 
109 };
110 
111 }
112 
113 }
Definition: conversion.h:46
Definition: conversion.h:101