]> Creatis software - bbtk.git/blob - kernel/src/bbtkRTTI.cxx
#3212 BBTK Feature New Normal - vtk8itk4wx3-mingw64 MACOS
[bbtk.git] / kernel / src / bbtkRTTI.cxx
1 /*
2  # ---------------------------------------------------------------------
3  #
4  # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5  #                        pour la SantÈ)
6  # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7  # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8  # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9  #
10  #  This software is governed by the CeCILL-B license under French law and
11  #  abiding by the rules of distribution of free software. You can  use,
12  #  modify and/ or redistribute the software under the terms of the CeCILL-B
13  #  license as circulated by CEA, CNRS and INRIA at the following URL
14  #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15  #  or in the file LICENSE.txt.
16  #
17  #  As a counterpart to the access to the source code and  rights to copy,
18  #  modify and redistribute granted by the license, users are provided only
19  #  with a limited warranty  and the software's author,  the holder of the
20  #  economic rights,  and the successive licensors  have only  limited
21  #  liability.
22  #
23  #  The fact that you are presently reading this means that you have had
24  #  knowledge of the CeCILL-B license and that you accept its terms.
25  # ------------------------------------------------------------------------ */
26
27
28 /*=========================================================================
29   Program:   bbtk
30   Module:    $RCSfile: bbtkRTTI.cxx,v $
31   Language:  C++
32   Date:      $Date: 2012/11/16 08:49:01 $
33   Version:   $Revision: 1.5 $
34 =========================================================================*/
35
36
37
38
39 #include "bbtkRTTI.h"
40 #include "bbtkMessageManager.h"
41
42
43  
44 namespace bbtk
45 {
46   // Adapted from https://savannah.cern.ch/support/download.php?file_id=1972
47   
48   // Something to which we can cast the void*s, to allow finding the
49   // dynamic typeid.
50   struct Dummy {
51     virtual ~Dummy() {}
52   };
53   
54
55  void*  run_time_up_or_down_cast( const std::type_info& target_type,
56                                const std::type_info& source_type,
57                                const void*  source_pointer
58                                )
59  {
60    return run_time_up_or_down_cast(target_type,
61                                    source_type,
62                                    const_cast<void*>(source_pointer));
63  }
64
65   void*   run_time_up_or_down_cast( const std::type_info& target_type,
66                                const std::type_info& source_type,
67                                void*  source_pointer
68                                )
69   {
70     bbtkDebugMessage("data",5,
71                      "run_time_up_or_down_cast : Casting pointer to '" 
72                      << TypeName(typeid(*(Dummy*)source_pointer)) 
73                      << "' from " << TypeName(source_type) 
74                      << " to " << TypeName(target_type) << std::endl);
75
76     void* target_pointer = 0;
77     
78     
79     
80 #if __APPLE__
81    //EED2018-08-28  Be careful  #include <typeinfo> is not complete  (CommandLine mechanisme Xcode)
82     printf("EED bbtkRTTI  run_time_up_or_down_cast   2018-08-28 Warnning !!!!  Apple cast missing  __do_upcast   ");
83         return source_pointer;
84 #else    
85   #if __GNUC__ > 3 ||                                   \
86     (__GNUC__ == 3 && (__GNUC_MINOR__ > 1 ||            \
87                      (__GNUC_MINOR__ == 1 &&            \
88                       __GNUC_PATCHLEVEL__ > 0)))
89     
90     const abi::__class_type_info* targetTI = 
91       (const abi::__class_type_info *)( &(target_type));
92     
93     bbtkDebugMessage("data",7," * source   = "<<source_pointer<<std::endl);
94
95     void* tmp = source_pointer;
96     if (source_type.__do_upcast(targetTI,&tmp)) 
97     {
98           target_pointer = tmp;
99     } else {
100            bbtkDebugMessage("data",7,
101                          " * upcast failed : trying dynamic down cast"
102                          <<std::endl);
103            const abi::__class_type_info* sourceTI = (const abi::__class_type_info *)( &(source_type));
104            target_pointer = abi::__dynamic_cast(source_pointer, 
105                                              sourceTI, 
106                                              targetTI, 
107                                              -1);   
108       }
109       bbtkDebugMessage("data",7," * target   = "<<target_pointer<<std::endl);
110   #else
111     bbtkWarning("run_time_up_or_down_cast not impl. on Win : to do");
112     // target_pointer = __RTDynamicCast(source_pointer, 0, source_type, target_type, 0);
113   #endif
114     return target_pointer;
115 #endif    
116     
117   }
118
119 }
120