CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
clone_ptr.h
Go to the documentation of this file.
1 #ifndef FWCore_Utilities_clone_ptr_h
2 #define FWCore_Utilities_clone_ptr_h
3 
4 #include<memory>
6 
7 namespace extstd {
8 
9  /* modify unique_ptr behaviour adding a "cloning" copy-constructor and assignment-operator
10  */
11  template<typename T>
12  struct clone_ptr : public std::unique_ptr<T> {
13 
14  template<typename... Args>
15  explicit clone_ptr(Args&& ... args) noexcept : std::unique_ptr<T>(std::forward<Args>(args)...){}
16 
17  clone_ptr(clone_ptr const & rh) : std::unique_ptr<T>(rh? rh->clone() : nullptr){}
18  clone_ptr(clone_ptr && rh) noexcept : std::unique_ptr<T>(std::move(rh)) {}
19 
20  clone_ptr & operator=(clone_ptr const & rh) {
21  if (&rh!=this) this->reset(rh? rh->clone() : nullptr);
22  return *this;
23  }
25  if (&rh!=this) std::unique_ptr<T>::operator=(std::move(rh));
26  return *this;
27  }
28 
29 
30  template<typename U>
31  clone_ptr(clone_ptr<U> const & rh) : std::unique_ptr<T>(rh ? rh->clone() : nullptr){}
32  template<typename U>
33  clone_ptr(clone_ptr<U> && rh) noexcept : std::unique_ptr<T>(std::move(rh)) {}
34 
35  template<typename U>
37  if (&rh!=this) this->reset(rh? rh->clone() : nullptr);
38  return *this;
39  }
40  template<typename U>
42  if (&rh!=this) std::unique_ptr<T>::operator=(std::move(rh));
43  return *this;
44  }
45 
46  };
47 
48 }
49 
50 #endif
clone_ptr & operator=(clone_ptr &&rh) noexcept
Definition: clone_ptr.h:24
clone_ptr & operator=(clone_ptr< U > const &rh)
Definition: clone_ptr.h:36
clone_ptr(Args &&...args) noexcept
Definition: clone_ptr.h:15
clone_ptr & operator=(clone_ptr const &rh)
Definition: clone_ptr.h:20
#define nullptr
clone_ptr(clone_ptr const &rh)
Definition: clone_ptr.h:17
clone_ptr(clone_ptr< U > &&rh) noexcept
Definition: clone_ptr.h:33
clone_ptr(clone_ptr< U > const &rh)
Definition: clone_ptr.h:31
#define noexcept
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
clone_ptr & operator=(clone_ptr< U > &&rh) noexcept
Definition: clone_ptr.h:41
long double T
void reset(double vett[256])
Definition: TPedValues.cc:11
clone_ptr(clone_ptr &&rh) noexcept
Definition: clone_ptr.h:18