@@ -23,40 +23,43 @@ class sexp {
23
23
// REprintf("created %x %x : %i\n", data_, preserve_token_, protect_head_size());
24
24
}
25
25
26
- sexp (const sexp& rhs) {
27
- data_ = rhs.data_ ;
28
- preserve_token_ = preserved.insert (data_);
26
+ sexp (const sexp& rhs) : data_(rhs.data_), preserve_token_(preserved.insert(rhs.data_)) {
29
27
// REprintf("copied %x new protect %x : %i\n", rhs.data_, preserve_token_,
30
28
// protect_head_size());
31
29
}
32
30
33
- sexp (sexp&& rhs) {
34
- data_ = rhs.data_ ;
35
- preserve_token_ = rhs.preserve_token_ ;
36
-
31
+ sexp (sexp&& rhs) : data_(rhs.data_), preserve_token_(rhs.preserve_token_) {
37
32
rhs.data_ = R_NilValue;
38
33
rhs.preserve_token_ = R_NilValue;
39
34
40
35
// REprintf("moved %x : %i\n", rhs.data_, protect_head_size());
41
36
}
42
37
43
38
sexp& operator =(const sexp& rhs) {
44
- preserved.release (preserve_token_);
39
+ if (data_ != rhs.data_ ) {
40
+ SEXP old_preserve_token = preserve_token_;
41
+
42
+ data_ = rhs.data_ ;
43
+ preserve_token_ = preserved.insert (data_);
44
+
45
+ preserved.release (old_preserve_token);
46
+ }
45
47
46
- data_ = rhs.data_ ;
47
- preserve_token_ = preserved.insert (data_);
48
48
// REprintf("assigned %x : %i\n", rhs.data_, protect_head_size());
49
49
return *this ;
50
50
}
51
51
52
52
sexp& operator =(sexp&& rhs) {
53
- preserved.release (preserve_token_);
53
+ if (data_ != rhs.data_ ) {
54
+ SEXP old_preserve_token = preserve_token_;
54
55
55
- data_ = rhs.data_ ;
56
- preserve_token_ = rhs.preserve_token_ ;
56
+ data_ = rhs.data_ ;
57
+ preserve_token_ = rhs.preserve_token_ ;
57
58
58
- rhs.data_ = R_NilValue;
59
- rhs.preserve_token_ = R_NilValue;
59
+ rhs.data_ = R_NilValue;
60
+ rhs.preserve_token_ = R_NilValue;
61
+ preserved.release (old_preserve_token);
62
+ }
60
63
61
64
// REprintf("moved %x : %i\n", rhs.data_, protect_head_size());
62
65
return *this ;
@@ -68,7 +71,9 @@ class sexp {
68
71
// *this = tmp;
69
72
// }
70
73
71
- ~sexp () { preserved.release (preserve_token_); }
74
+ ~sexp () {
75
+ preserved.release (preserve_token_);
76
+ }
72
77
73
78
attribute_proxy<sexp> attr (const char * name) const {
74
79
return attribute_proxy<sexp>(*this , name);
@@ -87,9 +92,11 @@ class sexp {
87
92
}
88
93
89
94
operator SEXP () const { return data_; }
95
+ /*
90
96
operator double() const { return REAL_ELT(data_, 0); }
91
97
operator size_t() const { return REAL_ELT(data_, 0); }
92
98
operator bool() const { return LOGICAL_ELT(data_, 0); }
99
+ */
93
100
SEXP data () const { return data_; }
94
101
};
95
102
0 commit comments