IterationPack: General framework for building iterative algorithms  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
IterationPack_cast_iq.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
5 // Copyright (2003) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef GIP_CAST_IQ_H
43 #define GIP_CAST_IQ_H
44 
45 #include <stdexcept>
46 #include <typeinfo>
47 
48 #include "IterationPack_AlgorithmState.hpp"
49 #include "IterationPack_IterQuantityAccess.hpp"
50 
51 namespace IterationPack {
52 
66 template<class T>
67 IterQuantityAccess<T>& cast_iq(
68  AlgorithmState& state, const std::string& iq_name );
69 
71 template<class T>
72 const IterQuantityAccess<T>& cast_iq(
73  const AlgorithmState& state, const std::string& iq_name );
74 
90 template<class T>
91 IterQuantityAccess<T>& cast_iq(
92  AlgorithmState& state, const AlgorithmState::iq_id_type iq_id, const std::string& iq_name );
93 
95 template<class T>
96 const IterQuantityAccess<T>& cast_iq(
97  const AlgorithmState& state, const AlgorithmState::iq_id_type iq_id, const std::string& iq_name );
98 
99 // Helper function
100 
101 void imp_cast_iq_throw_error(
102  const std::string& iq_name
103  ,const std::string& iq_is_type_name
104  ,const std::string& iq_want_type_name
105  );
106 
107 void imp_cast_iq_throw_error(
108  const AlgorithmState::iq_id_type iq_id
109  ,const std::string& iq_name
110  ,const std::string& iq_is_type_name
111  ,const std::string& iq_want_type_name
112  );
113 
114 // ///////////////////
115 // Inline definitions
116 
117 template<class T>
118 //inline
119 IterQuantityAccess<T>& cast_iq(
120  AlgorithmState& state, const std::string& iq_name )
121 {
122  IterQuantity
123  &iq = state.iter_quant( iq_name );
124  IterQuantityAccess<T>
125  *p = dynamic_cast<IterQuantityAccess<T>*>( &iq );
126  // will throw exception if iq_name does not exist
127  if( !p )
128  imp_cast_iq_throw_error( iq_name, typeName(iq), TypeNameTraits<T>::name() );
129  return *p;
130 }
131 
132 template<class T>
133 //inline
134 const IterQuantityAccess<T>& cast_iq(
135  const AlgorithmState& state, const std::string& iq_name )
136 {
137  const IterQuantity
138  &iq = state.iter_quant( iq_name );
139  const IterQuantityAccess<T>
140  *p = dynamic_cast<const IterQuantityAccess<T>*>( &iq );
141  // will throw exception if iq_name does not exist
142  if( !p )
143  imp_cast_iq_throw_error( iq_name, typeName(iq), TypeNameTraits<T>::name() );
144  return *p;
145 }
146 
147 template<class T>
148 //inline
149 IterQuantityAccess<T>& cast_iq(
150  AlgorithmState& state, const AlgorithmState::iq_id_type iq_id, const std::string& iq_name )
151 {
152  IterQuantity
153  &iq = state.iter_quant( iq_id );
154  IterQuantityAccess<T>
155  *p = dynamic_cast<IterQuantityAccess<T>*>( &iq );
156  // will throw exception if iq_name does not exist
157  if( !p )
158  imp_cast_iq_throw_error( iq_id, iq_name, typeName(iq), TypeNameTraits<T>::name() );
159  return *p;
160 }
161 
162 template<class T>
163 //inline
164 const IterQuantityAccess<T>& cast_iq(
165  const AlgorithmState& state, const AlgorithmState::iq_id_type iq_id, const std::string& iq_name )
166 {
167  const IterQuantity
168  &iq = state.iter_quant( iq_id );
169  const IterQuantityAccess<T>
170  *p = dynamic_cast<const IterQuantityAccess<T>*>( &iq );
171  // will throw exception if iq_name does not exist
172  if( !p )
173  imp_cast_iq_throw_error( iq_id, iq_name, typeName(iq), TypeNameTraits<T>::name() );
174  return *p;
175 }
176 
177 } // namespace IterationPack
178 
179 #endif // GIP_CAST_IQ_H
std::string typeName(const T &t)