Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <memory>
00015 #include <cstring>
00016
00017
00018 #include "FWCore/Framework/interface/DataKey.h"
00019
00020
00021
00022
00023
00024
00025 static const char kBlank[] = {'\0'};
00026
00027 namespace edm {
00028 namespace eventsetup {
00029
00030
00031
00032
00033
00034
00035
00036 DataKey::DataKey(): type_(), name_(), ownMemory_(false)
00037 {
00038 }
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 DataKey& DataKey::operator=(const DataKey& rhs)
00053 {
00054
00055 DataKey temp(rhs);
00056 swap(temp);
00057
00058 return *this;
00059 }
00060
00061
00062
00063
00064 void
00065 DataKey::swap(DataKey& iOther)
00066 {
00067 std::swap(ownMemory_, iOther.ownMemory_);
00068
00069
00070 using std::swap;
00071 swap(type_, iOther.type_);
00072 swap(name_, iOther.name_);
00073 }
00074
00075 namespace {
00076
00077 class ArrayHolder {
00078 public:
00079 ArrayHolder():ptr_(nullptr){}
00080
00081 void swap(ArrayHolder& iOther) {
00082 const char* t = iOther.ptr_;
00083 iOther.ptr_ = ptr_;
00084 ptr_ = t;
00085 }
00086 ArrayHolder(const char* iPtr): ptr_(iPtr) {}
00087 ~ArrayHolder() { delete [] ptr_; }
00088 void release() { ptr_=0;}
00089 private:
00090 const char* ptr_;
00091 };
00092 }
00093 void
00094 DataKey::makeCopyOfMemory()
00095 {
00096
00097
00098 char* pName = const_cast<char*>(kBlank);
00099
00100
00101
00102 ArrayHolder pNameHolder;
00103 if(kBlank[0] != name().value()[0]) {
00104 size_t const nBytes = std::strlen(name().value()) + 1;
00105 pName = new char[nBytes];
00106 ArrayHolder t(pName);
00107 pNameHolder.swap(t);
00108 std::strncpy(pName, name().value(), nBytes);
00109 }
00110 name_ = NameTag(pName);
00111 ownMemory_ = true;
00112 pNameHolder.release();
00113 }
00114
00115 void
00116 DataKey::deleteMemory()
00117 {
00118 if(kBlank[0] != name().value()[0]) {
00119 delete [] const_cast<char*>(name().value());
00120 }
00121 }
00122
00123
00124
00125
00126 bool
00127 DataKey::operator==(const DataKey& iRHS) const
00128 {
00129 return ((type_ == iRHS.type_) &&
00130 (name_ == iRHS.name_));
00131 }
00132
00133 bool
00134 DataKey::operator<(const DataKey& iRHS) const
00135 {
00136 return (type_ < iRHS.type_) ||
00137 ((type_ == iRHS.type_) && (name_ < iRHS.name_));
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 }
00148
00149
00150
00151
00152 }
00153 }