1 // Copyright (C) 2013 Romain Francois 2 // 3 // This file is part of Rcpp. 4 // 5 // Rcpp is free software: you can redistribute it and/or modify it 6 // under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 2 of the License, or 8 // (at your option) any later version. 9 // 10 // Rcpp is distributed in the hope that it will be useful, but 11 // WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with Rcpp. If not, see <http://www.gnu.org/licenses/>. 17 18 #ifndef Rcpp_protection_Armor_H 19 #define Rcpp_protection_Armor_H 20 21 namespace Rcpp { 22 23 template <typename T> 24 class Armor { 25 public: 26 Armor()27 Armor() : data(){ 28 init(R_NilValue) ; 29 } 30 31 template <typename U> Armor( U x ); 32 SEXP()33 inline operator SEXP() const { 34 return data ; 35 } 36 37 template <typename U> 38 inline Armor& operator=( const U& x ) ; 39 ~Armor()40 ~Armor(){ 41 UNPROTECT(1) ; 42 } 43 44 private: init(SEXP x)45 void init(SEXP x){ 46 PROTECT_WITH_INDEX( data = x, &index ) ; 47 } 48 49 SEXP data ; 50 PROTECT_INDEX index ; 51 52 // not defined on purpose 53 Armor(const Armor&) ; 54 Armor& operator=(const Armor&) ; 55 } ; 56 } 57 58 #endif 59