Matrix r4655
Loading...
Searching...
No Matches
objects.c
Go to the documentation of this file.
1#include "Mdefines.h"
2#include "objects.h"
3
4SEXP newObject(const char *what)
5{
6 SEXP class = PROTECT(R_do_MAKE_CLASS(what)), obj = R_do_new_object(class);
7 UNPROTECT(1);
8 return obj;
9}
10
11char typeToKind(SEXPTYPE type)
12{
13 switch (type) {
14 case LGLSXP:
15 return 'l';
16 case INTSXP:
17 return 'i';
18 case REALSXP:
19 return 'd';
20 case CPLXSXP:
21 return 'z';
22 default:
23 error(_("unexpected type \"%s\" in '%s'"), type2char(type), __func__);
24 return '\0';
25 }
26}
27
28SEXPTYPE kindToType(char kind)
29{
30 switch (kind) {
31 case 'n':
32 case 'l':
33 return LGLSXP;
34 case 'i':
35 return INTSXP;
36 case 'd':
37 return REALSXP;
38 case 'z':
39 return CPLXSXP;
40 default:
41 error(_("unexpected kind \"%c\" in '%s'"), kind, __func__);
42 return NILSXP;
43 }
44}
45
46size_t kindToSize(char kind)
47{
48 switch (kind) {
49 case 'n':
50 case 'l':
51 case 'i':
52 return sizeof(int);
53 case 'd':
54 return sizeof(double);
55 case 'z':
56 return sizeof(Rcomplex);
57 default:
58 error(_("unexpected kind \"%c\" in '%s'"), kind, __func__);
59 return 0;
60 }
61}
62
63const char *Matrix_nonvirtual(SEXP obj, int strict)
64{
65 if (!IS_S4_OBJECT(obj))
66 return "";
67 static const char *valid[] = { VALID_NONVIRTUAL, "" };
68 int ivalid = R_check_class_etc(obj, valid);
69 if (ivalid < 0)
70 return "";
71 if (!strict)
72 ivalid += VALID_NONVIRTUAL_SHIFT(ivalid, 1);
73 return valid[ivalid];
74}
75
76char Matrix_kind(SEXP obj)
77{
78 if (IS_S4_OBJECT(obj)) {
79 static const char *valid[] = { VALID_NONVIRTUAL, "" };
80 int ivalid = R_check_class_etc(obj, valid);
81 if (ivalid < 0)
82 return '\0';
83 ivalid += VALID_NONVIRTUAL_SHIFT(ivalid, 1);
84 const char *cl = valid[ivalid];
85 return (cl[2] == 'd') ? 'n' : cl[0];
86 } else {
87 switch (TYPEOF(obj)) {
88 case LGLSXP:
89 return 'l';
90 case INTSXP:
91 return 'i';
92 case REALSXP:
93 return 'd';
94 case CPLXSXP:
95 return 'z';
96 default:
97 return '\0';
98 }
99 }
100}
101
102char Matrix_shape(SEXP obj)
103{
104 if (!IS_S4_OBJECT(obj))
105 return '\0';
106 static const char *valid[] = { VALID_NONVIRTUAL, "" };
107 int ivalid = R_check_class_etc(obj, valid);
108 if (ivalid < 0)
109 return '\0';
110 ivalid += VALID_NONVIRTUAL_SHIFT(ivalid, 1);
111 const char *cl = valid[ivalid];
112 return (cl[3] != 'M') ? 'g' : ((cl[2] == 'd') ? 'i' : cl[1]);
113}
114
115char Matrix_repr(SEXP obj)
116{
117 if (!IS_S4_OBJECT(obj))
118 return '\0';
119 static const char *valid[] = { VALID_NONVIRTUAL_MATRIX, "" };
120 int ivalid = R_check_class_etc(obj, valid);
121 if (ivalid < 0)
122 return '\0';
123 ivalid += VALID_NONVIRTUAL_SHIFT(ivalid, 1);
124 const char *cl = valid[ivalid];
125 switch (cl[2]) {
126 case 'e':
127 case 'y':
128 case 'r':
129 return 'u'; /* unpackedMatrix */
130 case 'p':
131 return 'p'; /* packedMatrix */
132 case 'C':
133 return 'C'; /* CsparseMatrix */
134 case 'R':
135 return 'R'; /* RsparseMatrix */
136 case 'T':
137 return 'T'; /* TsparseMatrix */
138 case 'i':
139 return 'd'; /* diagonalMatrix */
140 case 'd':
141 return 'i'; /* indMatrix */
142 default:
143 return '\0';
144 }
145}
146
147SEXP R_Matrix_nonvirtual(SEXP obj, SEXP strict)
148{
149 return mkString(Matrix_nonvirtual(obj, asLogical(strict)));
150}
151
152#define RETURN_AS_STRSXP(_C_) \
153do { \
154 char c = _C_; \
155 if (!c) \
156 return mkString(""); \
157 else { \
158 char s[] = { c, '\0' }; \
159 return mkString(s); \
160 } \
161} while (0)
162
163SEXP R_Matrix_kind(SEXP obj)
164{
166}
167
168SEXP R_Matrix_shape(SEXP obj)
169{
171}
172
173SEXP R_Matrix_repr(SEXP obj)
174{
176}
#define _(String)
Definition Mdefines.h:44
#define VALID_NONVIRTUAL
Definition Mdefines.h:244
#define VALID_NONVIRTUAL_MATRIX
Definition Mdefines.h:220
#define VALID_NONVIRTUAL_SHIFT(i, pToInd)
Definition Mdefines.h:247
static const char * valid[]
Definition bind.c:5
cholmod_common cl
Definition cholmod-etc.c:6
const char * Matrix_nonvirtual(SEXP obj, int strict)
Definition objects.c:63
SEXP R_Matrix_repr(SEXP obj)
Definition objects.c:173
SEXP R_Matrix_kind(SEXP obj)
Definition objects.c:163
SEXP newObject(const char *what)
Definition objects.c:4
char Matrix_kind(SEXP obj)
Definition objects.c:76
size_t kindToSize(char kind)
Definition objects.c:46
#define RETURN_AS_STRSXP(_C_)
Definition objects.c:152
char Matrix_shape(SEXP obj)
Definition objects.c:102
SEXP R_Matrix_shape(SEXP obj)
Definition objects.c:168
char Matrix_repr(SEXP obj)
Definition objects.c:115
char typeToKind(SEXPTYPE type)
Definition objects.c:11
SEXPTYPE kindToType(char kind)
Definition objects.c:28
SEXP R_Matrix_nonvirtual(SEXP obj, SEXP strict)
Definition objects.c:147