[ismrmrd] 41/177: Changed implementation of C++ ImageHeader and Image to be castable to and from C version.

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:02:00 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to annotated tag v1.1.0.beta.1
in repository ismrmrd.

commit 49c19d7207dbefa06eadfec02fd88702328d9bb8
Author: Souheil Inati <souheil.inati at nih.gov>
Date:   Wed Sep 3 15:36:51 2014 -0400

    Changed implementation of C++ ImageHeader and Image to be castable to and from C version.
---
 ismrmrd.c           |  19 ++++++--
 ismrmrd.cpp         | 129 +++++++++++++++++++++++++++++++++-------------------
 ismrmrd.h           |  28 +++++++-----
 ismrmrd_dataset.cpp |   4 +-
 4 files changed, 114 insertions(+), 66 deletions(-)

diff --git a/ismrmrd.c b/ismrmrd.c
index 86ea9b0..583e7c7 100644
--- a/ismrmrd.c
+++ b/ismrmrd.c
@@ -118,10 +118,10 @@ void ismrmrd_init_image_header(ISMRMRD_ImageHeader *hdr) {
 }
 
 /* Image functions */
-void ismrmrd_init_image(ISMRMRD_Image *im) {
-    ismrmrd_init_image_header(&im->head);
-    im->attribute_string = NULL;
-    im->data = NULL;
+ISMRMRD_Image * ismrmrd_create_image() {
+    ISMRMRD_Image *im = (ISMRMRD_Image *) malloc(sizeof(ISMRMRD_Image));
+    ismrmrd_init_image(im);
+    return im;
 }
 
 void ismrmrd_free_image(ISMRMRD_Image *im) {
@@ -129,7 +129,18 @@ void ismrmrd_free_image(ISMRMRD_Image *im) {
     free(im->attribute_string);
     free(im);
 }
+    
+void ismrmrd_init_image(ISMRMRD_Image *im) {
+    ismrmrd_init_image_header(&im->head);
+    im->attribute_string = NULL;
+    im->data = NULL;
+}
 
+void ismrmrd_cleanup_image(ISMRMRD_Image *im) {
+    free(im->attribute_string);
+    free(im->data);
+}
+    
 void ismrmrd_copy_image(ISMRMRD_Image *imdest, const ISMRMRD_Image *imsource) {
     memcpy(&imdest->head, &imsource->head, sizeof(ISMRMRD_ImageHeader));
     ismrmrd_make_consistent_image(imdest);
diff --git a/ismrmrd.cpp b/ismrmrd.cpp
index b87e2d4..aa5ce03 100644
--- a/ismrmrd.cpp
+++ b/ismrmrd.cpp
@@ -46,12 +46,6 @@ Acquisition::Acquisition(const Acquisition &other) {
     ismrmrd_copy_acquisition(this, &other);
 }
 
-Acquisition::Acquisition(const ISMRMRD_Acquisition *acq) {
-    // This is a deep copy
-    ismrmrd_init_acquisition(this);
-    ismrmrd_copy_acquisition(this, acq);
-}
-
 Acquisition & Acquisition::operator= (const Acquisition &other) {
     // Assignment makes a copy
     if (this != &other )
@@ -240,159 +234,198 @@ void ImageHeader::clearAllFlags() {
 
 // Constructors
 Image::Image() {
-    ismrmrd_init_image(&image_);
+    ismrmrd_init_image(this);
 };
 
+Image::Image(const Image &other) {
+    // This is a deep copy
+    ismrmrd_init_image(this);
+    ismrmrd_copy_image(this, &other);
+}
+
+Image & Image::operator= (const Image &other) {
+    // Assignment makes a copy
+    if (this != &other )
+    {
+        ismrmrd_init_image(this);
+        ismrmrd_copy_image(this, &other);
+    }
+    return *this;
+}
+
+Image::~Image() {
+    ismrmrd_cleanup_image(this);
+}
+
 // Accessors and mutators
 const uint16_t &Image::version() {
-    return image_.head.version;
+    return head.version;
 };
 
 const uint16_t &Image::data_type() {
-    return image_.head.data_type;
+    return head.data_type;
 };
 
 void Image::data_type(uint16_t dtype) {
     // TODO function to check if type is valid
-    image_.head.data_type = dtype;
-    ismrmrd_make_consistent_image(&image_);
+    head.data_type = dtype;
+    ismrmrd_make_consistent_image(this);
 };
 
 const uint64_t &Image::flags() {
-    return image_.head.flags;
+    return head.flags;
 };
 
 uint32_t &Image::measurement_uid() {
-    return image_.head.measurement_uid;
+    return head.measurement_uid;
 };
 
 const uint16_t (&Image::matrix_size())[3] {
-    return image_.head.matrix_size;
+    return head.matrix_size;
 };
 
 void Image::matrix_size(const uint16_t msize[3]) {
-    image_.head.matrix_size[0] = msize[0];
+    head.matrix_size[0] = msize[0];
     if (msize[1] > 1) {
-        image_.head.matrix_size[1] = msize[1];
+        head.matrix_size[1] = msize[1];
     } else {
-        image_.head.matrix_size[1] = 1;
+        head.matrix_size[1] = 1;
     }
     if (msize[2] > 0) {
-        image_.head.matrix_size[2] = msize[2];
+        head.matrix_size[2] = msize[2];
     } else {
-        image_.head.matrix_size[2] = 1;
+        head.matrix_size[2] = 1;
     }
-    ismrmrd_make_consistent_image(&image_);
+    ismrmrd_make_consistent_image(this);
 };
 
 float (&Image::field_of_view())[3] {
-    return image_.head.field_of_view;
+    return head.field_of_view;
 };
 
 const uint16_t &Image::channels() {
-    return image_.head.channels;
+    return head.channels;
 };
 
 void Image::channels(const uint16_t num_channels) {
     if (num_channels > 1) {
-        image_.head.channels = num_channels;
+        head.channels = num_channels;
     } else {
-        image_.head.channels = 1;
+        head.channels = 1;
     }
-    ismrmrd_make_consistent_image(&image_);
+    ismrmrd_make_consistent_image(this);
 };
 
 float (&Image::position())[3] {
-    return image_.head.position;
+    return head.position;
 };
 
 float (&Image::read_dir())[3] {
-    return image_.head.read_dir;
+    return head.read_dir;
 };
 
 float (&Image::phase_dir())[3] {
-    return image_.head.phase_dir;
+    return head.phase_dir;
 };
 
 float (&Image::slice_dir())[3] {
-    return image_.head.slice_dir;
+    return head.slice_dir;
 };
 
 float (&Image::patient_table_position())[3] {
-    return image_.head.patient_table_position;
+    return head.patient_table_position;
 };
 
 uint16_t &Image::average() {
-    return image_.head.average;
+    return head.average;
 };
 
 uint16_t &Image::slice() {
-    return image_.head.slice;
+    return head.slice;
 };
 
 uint16_t &Image::contrast() {
-    return image_.head.contrast;
+    return head.contrast;
 };
 
 uint16_t &Image::phase() {
-    return image_.head.repetition;
+    return head.repetition;
 };
 
 uint16_t &Image::repetition() {
-    return image_.head.repetition;
+    return head.repetition;
 };
 
 uint16_t &Image::set() {
-    return image_.head.set;
+    return head.set;
 };
 
 uint32_t &Image::acquisition_time_stamp() {
-    return image_.head.acquisition_time_stamp;
+    return head.acquisition_time_stamp;
 };
 
 uint32_t (&Image::physiology_time_stamp()) [ISMRMRD_PHYS_STAMPS] { 
-    return image_.head.physiology_time_stamp;
+    return head.physiology_time_stamp;
 };
 
 uint16_t &Image::image_type() {
-    return image_.head.image_type;
+    return head.image_type;
 };
 
 uint16_t &Image::image_index() {
-    return image_.head.image_index;
+    return head.image_index;
 };
 
 uint16_t &Image::image_series_index() {
-    return image_.head.image_series_index;
+    return head.image_series_index;
 };
 
 int32_t (&Image::user_int()) [ISMRMRD_USER_INTS] { 
-    return image_.head.user_int;
+    return head.user_int;
 };
 
 float (&Image::user_float()) [ISMRMRD_USER_FLOATS] {
-    return image_.head.user_float;
+    return head.user_float;
 };
 
 const uint32_t &Image::attribute_string_len() {
-    return image_.head.attribute_string_len;
+    return head.attribute_string_len;
 };
 
+// Header and data accessors
+ImageHeader &Image::getHead() {
+    // This returns a reference
+    return *static_cast<ImageHeader *>(&head);
+}
+
+void Image::setHead(const ImageHeader other) {
+    memcpy(&head, &other, sizeof(ImageHeader));
+    ismrmrd_make_consistent_image(this);
+}
+
+char *Image::getAttributeString() {
+    return attribute_string;
+}
+
+void *Image::getData() {
+    return data;
+}
+
 // Flag methods
 bool Image::isFlagSet(const uint64_t val) {
-    return ismrmrd_is_flag_set(image_.head.flags, val);
+    return ismrmrd_is_flag_set(head.flags, val);
 };
 
 void Image::setFlag(const uint64_t val) {
-    ismrmrd_set_flag(&(image_.head.flags), val);
+    ismrmrd_set_flag(&(head.flags), val);
 };
 
 void Image::clearFlag(const uint64_t val) {
-    ismrmrd_clear_flag(&(image_.head.flags), val);
+    ismrmrd_clear_flag(&(head.flags), val);
 };
 
 void Image::clearAllFlags() {
-    ismrmrd_clear_all_flags(&(image_.head.flags));
+    ismrmrd_clear_all_flags(&(head.flags));
 };
 
 //
diff --git a/ismrmrd.h b/ismrmrd.h
index 667ee0a..b9ca0de 100644
--- a/ismrmrd.h
+++ b/ismrmrd.h
@@ -270,13 +270,16 @@ typedef struct ISMRMRD_Image {
     void *data;
 } ISMRMRD_Image;
 
-void ismrmrd_init_image(ISMRMRD_Image *im);
+
+ISMRMRD_Image * ismrmrd_create_image();
 void ismrmrd_free_image(ISMRMRD_Image *im);
+void ismrmrd_init_image(ISMRMRD_Image *im);
+void ismrmrd_cleanup_image(ISMRMRD_Image *im);
 void ismrmrd_copy_image(ISMRMRD_Image *imdest, const ISMRMRD_Image *imsource);
 int ismrmrd_make_consistent_image(ISMRMRD_Image *im);
 size_t ismrmrd_size_of_image_attribute_string(const ISMRMRD_Image *im);
 size_t ismrmrd_size_of_image_data(const ISMRMRD_Image *im);
-
+    
 /************/
 /* NDArrays */
 /************/
@@ -389,12 +392,10 @@ public:
 };
 
 class Acquisition: protected ISMRMRD_Acquisition {
-    friend class Dataset;
 public:
     // Constructors, assignment, destructor
     Acquisition();
     Acquisition(const Acquisition &other);
-    Acquisition(const ISMRMRD_Acquisition *other);
     Acquisition & operator= (const Acquisition &other);
     ~Acquisition();
 
@@ -430,9 +431,7 @@ public:
     AcquisitionHeader &getHead();
     void setHead(const AcquisitionHeader other);
     complex_float_t *getData();
-    uint64_t numDataElements();
     float *getTraj();
-    uint64_t numTrajElements();
 
     // Flag methods
     bool isFlagSet(const uint64_t val);
@@ -462,12 +461,13 @@ public:
 
 };
 
-class Image {
+class Image : protected ISMRMRD_Image {
 public:
     // Constructors
     Image();
-    Image(Image &im);
-    Image(ISMRMRD_Image *im);
+    Image(const Image &other);
+    Image & operator= (const Image &other);
+    ~Image();
 
     // Accessors and mutators
     const uint16_t &version();
@@ -500,14 +500,18 @@ public:
     float (&user_float())[ISMRMRD_USER_FLOATS];
     const uint32_t &attribute_string_len();
 
+    // Header and data accessors
+    ImageHeader &getHead();
+    void setHead(const ImageHeader other);
+    char *getAttributeString();
+    void setAttributeString(std::string attr);
+    void *getData();
+
     // Flag methods
     bool isFlagSet(const uint64_t val);
     void setFlag(const uint64_t val);
     void clearFlag(const uint64_t val);
     void clearAllFlags();
-
-protected:
-    ISMRMRD_Image image_;
 };
 
 class NDArray: protected ISMRMRD_NDArray {
diff --git a/ismrmrd_dataset.cpp b/ismrmrd_dataset.cpp
index 097f959..2a5975d 100644
--- a/ismrmrd_dataset.cpp
+++ b/ismrmrd_dataset.cpp
@@ -60,14 +60,14 @@ char * Dataset::readHeader()
 // Acquisitions
 int Dataset::appendAcquisition(const Acquisition acq)
 {
-    int status = ismrmrd_append_acquisition(&dset_, static_cast<const ISMRMRD_Acquisition*>(&acq));
+    int status = ismrmrd_append_acquisition(&dset_, reinterpret_cast<const ISMRMRD_Acquisition*>(&acq));
     return status;
 }
 
 Acquisition * Dataset::readAcquisition(unsigned long index)
 {
     Acquisition * acq = new Acquisition();
-    int status = ismrmrd_read_acquisition(&dset_, index, static_cast<ISMRMRD_Acquisition*>(acq));
+    int status = ismrmrd_read_acquisition(&dset_, index, reinterpret_cast<ISMRMRD_Acquisition*>(acq));
     return acq;
 }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git



More information about the debian-science-commits mailing list