]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-dencoder: add 'copy' command to test operator=
authorSage Weil <sage@inktank.com>
Fri, 6 Dec 2013 01:16:39 +0000 (17:16 -0800)
committerSage Weil <sage@inktank.com>
Fri, 6 Dec 2013 22:37:29 +0000 (14:37 -0800)
Signed-off-by: Sage Weil <sage@inktank.com>
src/test/encoding/ceph_dencoder.cc
src/test/encoding/types.h

index dbed6f524d804bc1341bfa10ce307581db93c2ee..4ba9a44663d0cc5854f00ec5354014add855c89c 100644 (file)
 #define TYPE(t)
 #define TYPEWITHSTRAYDATA(t)
 #define TYPE_FEATUREFUL(t)
+#define TYPE_NOCOPY(t)
 #define MESSAGE(t)
 #include "types.h"
 #undef TYPE
 #undef TYPEWITHSTRAYDATA
 #undef TYPE_FEATUREFUL
+#undef TYPE_NOCOPY
 #undef MESSAGE
 
 void usage(ostream &out)
@@ -37,6 +39,9 @@ void usage(ostream &out)
   out << "  encode              encode in-memory object\n";
   out << "  dump_json           dump in-memory object as json (to stdout)\n";
   out << "\n";
+  out << "  copy                copy object (via operator=)\n";
+  out << "  copy_ctor           copy object (via copy ctor)\n";
+  out << "\n";
   out << "  count_tests         print number of generated test objects (to stdout)\n";
   out << "  select_test <n>     select generated test object as in-memory object\n";
 }
@@ -45,6 +50,12 @@ struct Dencoder {
   virtual string decode(bufferlist bl) = 0;
   virtual void encode(bufferlist& out, uint64_t features) = 0;
   virtual void dump(ceph::Formatter *f) = 0;
+  virtual void copy() {
+    cerr << "copy operator= not supported" << std::endl;
+  }
+  virtual void copy_ctor() {
+    cerr << "copy ctor not supported" << std::endl;
+  }
   virtual void generate() = 0;
   virtual int num_generated() = 0;
   virtual string select_generated(unsigned n) = 0;
@@ -82,7 +93,6 @@ public:
   void dump(ceph::Formatter *f) {
     m_object->dump(f);
   }
-
   void generate() {
     T::generate_test_instances(m_list);
   }
@@ -103,15 +113,34 @@ public:
 };
 
 template<class T>
-class DencoderImplNoFeature : public DencoderBase<T> {
+class DencoderImplNoFeatureNoCopy : public DencoderBase<T> {
 public:
-  DencoderImplNoFeature(bool stray_ok) : DencoderBase<T>(stray_ok) {}
+  DencoderImplNoFeatureNoCopy(bool stray_ok)
+    : DencoderBase<T>(stray_ok) {}
   virtual void encode(bufferlist& out, uint64_t features) {
     out.clear();
     this->m_object->encode(out);
   }
 };
 
+template<class T>
+class DencoderImplNoFeature : public DencoderImplNoFeatureNoCopy<T> {
+public:
+  DencoderImplNoFeature(bool stray_ok)
+    : DencoderImplNoFeatureNoCopy<T>(stray_ok) {}
+  void copy() {
+    T *n = new T;
+    *n = *this->m_object;
+    delete this->m_object;
+    this->m_object = n;
+  }
+  void copy_ctor() {
+    T *n = new T(*this->m_object);
+    delete this->m_object;
+    this->m_object = n;
+  }
+};
+
 template<class T>
 class DencoderImplFeatureful : public DencoderBase<T> {
 public:
@@ -166,7 +195,6 @@ public:
   void dump(ceph::Formatter *f) {
     m_object->dump(f);
   }
-
   void generate() {
     //T::generate_test_instances(m_list);
   }
@@ -203,6 +231,7 @@ int main(int argc, const char **argv)
 #define TYPE(t) dencoders[T_STRINGIFY(t)] = new DencoderImplNoFeature<t>(false);
 #define TYPEWITHSTRAYDATA(t) dencoders[T_STRINGIFY(t)] = new DencoderImplNoFeature<t>(true);
 #define TYPE_FEATUREFUL(t) dencoders[T_STRINGIFY(t)] = new DencoderImplFeatureful<t>(false);
+#define TYPE_NOCOPY(t) dencoders[T_STRINGIFY(t)] = new DencoderImplNoFeatureNoCopy<t>(false);
 #define MESSAGE(t) dencoders[T_STRINGIFY(t)] = new MessageDencoderImpl<t>;
 #include "types.h"
 #undef TYPE
@@ -275,6 +304,20 @@ int main(int argc, const char **argv)
        exit(1);
       }
       err = den->decode(encbl);
+    } else if (*i == string("copy_ctor")) {
+      if (!den) {
+       cerr << "must first select type with 'type <name>'" << std::endl;
+       usage(cerr);
+       exit(1);
+      }
+      den->copy_ctor();
+    } else if (*i == string("copy")) {
+      if (!den) {
+       cerr << "must first select type with 'type <name>'" << std::endl;
+       usage(cerr);
+       exit(1);
+      }
+      den->copy();
     } else if (*i == string("dump_json")) {
       if (!den) {
        cerr << "must first select type with 'type <name>'" << std::endl;
index 105760068ed32d3254edda22497b713281a72aa3..597586d9df4fb6a6820f460104034118969ea8f6 100644 (file)
@@ -34,7 +34,7 @@ TYPEWITHSTRAYDATA(OSDMap)
 TYPEWITHSTRAYDATA(OSDMap::Incremental)
 
 #include "crush/CrushWrapper.h"
-TYPE(CrushWrapper)
+TYPE_NOCOPY(CrushWrapper)
 
 #include "include/histogram.h"
 TYPE(pow2_hist_t)
@@ -152,7 +152,7 @@ TYPE_FEATUREFUL(MDSMap)
 TYPE_FEATUREFUL(MDSMap::mds_info_t)
 
 #include "mds/Capability.h"
-TYPE(Capability)
+TYPE_NOCOPY(Capability)
 
 #include "mds/AnchorServer.h"
 TYPE(AnchorServer)
@@ -171,7 +171,7 @@ TYPE(EImportFinish)
 #include "mds/events/EImportStart.h"
 TYPE(EImportStart)
 #include "mds/events/EMetaBlob.h"
-TYPE(EMetaBlob::fullbit)
+TYPE_NOCOPY(EMetaBlob::fullbit)
 TYPE(EMetaBlob::remotebit)
 TYPE(EMetaBlob::nullbit)
 TYPE(EMetaBlob::dirlump)