Rcpp Version 1.0.9
DimNameProxy.h
Go to the documentation of this file.
1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
2 //
3 // DimNameProxy.h: Rcpp R/C++ interface class library -- dimension name proxy
4 //
5 // Copyright (C) 2010 - 2014 Dirk Eddelbuettel, Romain Francois and Kevin Ushey
6 //
7 // This file is part of Rcpp.
8 //
9 // Rcpp is free software: you can redistribute it and/or modify it
10 // under the terms of the GNU General Public License as published by
11 // the Free Software Foundation, either version 2 of the License, or
12 // (at your option) any later version.
13 //
14 // Rcpp is distributed in the hope that it will be useful, but
15 // WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with Rcpp. If not, see <http://www.gnu.org/licenses/>.
21 
22 #ifndef Rcpp_vector_DimNameProxy_h
23 #define Rcpp_vector_DimNameProxy_h
24 
25 namespace Rcpp{
26 namespace internal{
27 
28  class DimNameProxy {
29 
30  public:
31 
32  DimNameProxy(SEXP data, int dim): data_(data), dim_(dim) {}
33  DimNameProxy(DimNameProxy const& other):
34  data_(other.data_), dim_(other.dim_) {}
35 
36  inline DimNameProxy& assign(SEXP other) {
37  if (Rf_length(other) == 0)
38  {
39  Rf_setAttrib(data_, R_DimNamesSymbol, R_NilValue);
40  } else {
41  SEXP dims = Rf_getAttrib(data_, R_DimSymbol);
42  if (INTEGER(dims)[dim_] != Rf_length(other)) {
43  stop("dimension extent is '%d' while length of names is '%d'", INTEGER(dims)[dim_], Rf_length(other));
44  }
45 
46  SEXP dimnames = Rf_getAttrib(data_, R_DimNamesSymbol);
47  if (Rf_isNull(dimnames)) {
48  Shield<SEXP> new_dimnames(Rf_allocVector(VECSXP, Rf_length(dims)));
49  SET_VECTOR_ELT(new_dimnames, dim_, other);
50  Rf_setAttrib(data_, R_DimNamesSymbol, new_dimnames);
51  } else {
52  SET_VECTOR_ELT(dimnames, dim_, other);
53  }
54  }
55  return *this;
56  }
57 
58  inline DimNameProxy& operator=(SEXP other) {
59  return assign(other);
60  }
61 
62  inline DimNameProxy& operator=(const DimNameProxy& other) {
63  return assign(SEXP(other));
64  }
65 
66  inline operator SEXP() const {
67  SEXP dimnames = Rf_getAttrib(data_, R_DimNamesSymbol);
68  return Rf_isNull(dimnames) ? (R_NilValue) : (VECTOR_ELT(dimnames, dim_));
69  }
70 
71  template <typename T>
72  inline operator T() const {
73  SEXP dimnames = Rf_getAttrib(data_, R_DimNamesSymbol);
74  if (Rf_isNull(dimnames)) {
75  return T();
76  } else {
77  return T(VECTOR_ELT(dimnames, dim_));
78  }
79  }
80 
81  private:
82 
83  SEXP data_;
84  int dim_;
85  };
86 
87 }
88 
89 }
90 
91 #endif
DimNameProxy(SEXP data, int dim)
Definition: DimNameProxy.h:32
DimNameProxy & operator=(SEXP other)
Definition: DimNameProxy.h:58
DimNameProxy(DimNameProxy const &other)
Definition: DimNameProxy.h:33
DimNameProxy & assign(SEXP other)
Definition: DimNameProxy.h:36
DimNameProxy & operator=(const DimNameProxy &other)
Definition: DimNameProxy.h:62
Rcpp API.
Definition: algo.h:28
void NORET stop(const char *fmt, Args &&... args)
Definition: exceptions.h:51