Simon Dirmeier
2018-08-16 08:10:53 UTC
Dear all,
I have a question about /R_PreserveObject /and/R_ReleaseObject
/and//thought this would be good place to post it.
I apologize if the question is not suitable or naive.
Suppose I have something like the class below for which I use
Rcpp-modules to extend it to R (code not shown).
I use "insert" to add key-value pair to a map and "remove" to remove an
entry.
I am not having memory issues or so, but the solution seems wrong to me
and I am concerned that it causes problems.
Could you please give me some advice if this implementation is wrong or
unefficient?
Thank you in advance.
Best,
Simon
template<typename T>
class map
{
public:
   map() = default;
   size_t size()
   {
       return map_.size();
   }
   void insert(T& t, SEXP u)
   {
       SEXP s = Rf_duplicate(VECTOR_ELT(u, i));
       R_PreserveObject(s);
       map_.insert(std::pair<T, SEXP>(t[i], s));
   }
   void remove(T& t)
   {
           auto iter = map_.equal_range(t);
           for (auto it = iter.first; it != iter.second; ++it)
           {
               R_ReleaseObject(it->second);
           }
           map_.erase(t);
   }
private:
   std::unordered_map<T, SEXP> map_;
};
I have a question about /R_PreserveObject /and/R_ReleaseObject
/and//thought this would be good place to post it.
I apologize if the question is not suitable or naive.
Suppose I have something like the class below for which I use
Rcpp-modules to extend it to R (code not shown).
I use "insert" to add key-value pair to a map and "remove" to remove an
entry.
I am not having memory issues or so, but the solution seems wrong to me
and I am concerned that it causes problems.
Could you please give me some advice if this implementation is wrong or
unefficient?
Thank you in advance.
Best,
Simon
template<typename T>
class map
{
public:
   map() = default;
   size_t size()
   {
       return map_.size();
   }
   void insert(T& t, SEXP u)
   {
       SEXP s = Rf_duplicate(VECTOR_ELT(u, i));
       R_PreserveObject(s);
       map_.insert(std::pair<T, SEXP>(t[i], s));
   }
   void remove(T& t)
   {
           auto iter = map_.equal_range(t);
           for (auto it = iter.first; it != iter.second; ++it)
           {
               R_ReleaseObject(it->second);
           }
           map_.erase(t);
   }
private:
   std::unordered_map<T, SEXP> map_;
};