CXXR (C++ R) API
SEXP_downcast.hpp
Go to the documentation of this file.
1 /*CXXR $Id: SEXP_downcast.hpp 1397 2013-08-16 18:25:59Z arr $
2  *CXXR
3  *CXXR This file is part of CXXR, a project to refactor the R interpreter
4  *CXXR into C++. It may consist in whole or in part of program code and
5  *CXXR documentation taken from the R project itself, incorporated into
6  *CXXR CXXR (and possibly MODIFIED) under the terms of the GNU General Public
7  *CXXR Licence.
8  *CXXR
9  *CXXR CXXR is Copyright (C) 2008-13 Andrew R. Runnalls, subject to such other
10  *CXXR copyrights and copyright restrictions as may be stated below.
11  *CXXR
12  *CXXR CXXR is not part of the R project, and bugs and other issues should
13  *CXXR not be reported via r-bugs or other R project channels; instead refer
14  *CXXR to the CXXR website.
15  *CXXR */
16 
17 /*
18  * R : A Computer Language for Statistical Data Analysis
19  *
20  * This program is free software; you can redistribute it and/or modify
21  * it under the terms of the GNU General Public License as published by
22  * the Free Software Foundation; either version 2.1 of the License, or
23  * (at your option) any later version.
24  *
25  * This program is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28  * GNU Lesser General Public License for more details.
29  *
30  * You should have received a copy of the GNU General Public License
31  * along with this program; if not, a copy is available at
32  * http://www.r-project.org/Licenses/
33  */
34 
38 #ifndef SEXP_DOWNCAST_HPP
39 #define SEXP_DOWNCAST_HPP 1
40 
41 #include "CXXR/RObject.h"
42 
43 namespace CXXR {
44 #ifdef __GNUC__
45  __attribute__((noreturn))
46 #endif
47 
51  void SEXP_downcast_error(const char* given, const char* wanted);
52 
70 #ifdef UNCHECKED_SEXP_DOWNCAST
71  template <typename PtrOut, typename PtrIn>
72  inline PtrOut SEXP_downcast(PtrIn s, bool allow_null = true)
73  {
74  if (!s && !allow_null) {
75  PtrOut exemplar = 0;
76  SEXP_downcast_error("NULL", exemplar->staticTypeName());
77  }
78  return static_cast<PtrOut>(s);
79  }
80 #else
81  template <typename PtrOut, typename PtrIn>
82  PtrOut SEXP_downcast(PtrIn s, bool allow_null = true)
83  {
84  PtrOut ans = 0;
85  if (!s) {
86  if (allow_null)
87  return 0;
88  else SEXP_downcast_error("NULL", ans->staticTypeName());
89  }
90  ans = dynamic_cast<PtrOut>(s);
91  if (!ans)
92  SEXP_downcast_error(s->typeName(), ans->staticTypeName());
93  return ans;
94  }
95 #endif
96 } // namespace CXXR
97 
98 #endif // SEXP_DOWNCAST_HPP