Some missing copy constructors / operator= / noncopyable.
authorCarl Hetherington <cth@carlh.net>
Tue, 16 Jul 2013 20:57:42 +0000 (21:57 +0100)
committerCarl Hetherington <cth@carlh.net>
Tue, 16 Jul 2013 20:57:42 +0000 (21:57 +0100)
src/lib/audio_analysis.cc
src/lib/audio_analysis.h
src/lib/audio_buffers.cc
src/lib/audio_buffers.h
src/lib/job.h

index e1251662089bd543fc3d713eadb8748ca37c8a9d..bc59bcccaa56539a6f8a4a1728c2d9e50e9e1a50 100644 (file)
@@ -48,6 +48,27 @@ AudioPoint::AudioPoint (istream& s)
        }
 }
 
+AudioPoint::AudioPoint (AudioPoint const & other)
+{
+       for (int i = 0; i < COUNT; ++i) {
+               _data[i] = other._data[i];
+       }
+}
+
+AudioPoint &
+AudioPoint::operator= (AudioPoint const & other)
+{
+       if (this == &other) {
+               return *this;
+       }
+       
+       for (int i = 0; i < COUNT; ++i) {
+               _data[i] = other._data[i];
+       }
+
+       return *this;
+}
+
 void
 AudioPoint::write (ostream& s) const
 {
index d57eba90a3184200a18619bcb0ac4b0727998038..cfc170c846ae2af87e12645e3dd84e4ba7e9c13a 100644 (file)
@@ -36,6 +36,8 @@ public:
 
        AudioPoint ();
        AudioPoint (std::istream &);
+       AudioPoint (AudioPoint const &);
+       AudioPoint& operator= (AudioPoint const &);
 
        void write (std::ostream &) const;
        
@@ -47,7 +49,7 @@ private:
        float _data[COUNT];
 };
 
-class AudioAnalysis
+class AudioAnalysis : public boost::noncopyable
 {
 public:
        AudioAnalysis (int c);
index 7b3af91e0069324efb4ca69f5e7c41a19ead512a..d387304142462c6245b70aace709c730deb669ae 100644 (file)
@@ -30,69 +30,70 @@ using boost::shared_ptr;
  *  @param frames Number of frames to reserve space for.
  */
 AudioBuffers::AudioBuffers (int channels, int frames)
-       : _channels (channels)
-       , _frames (frames)
-       , _allocated_frames (frames)
 {
-       _data = static_cast<float**> (malloc (_channels * sizeof (float *)));
-       if (!_data) {
-               throw bad_alloc ();
-       }
-       
-       for (int i = 0; i < _channels; ++i) {
-               _data[i] = static_cast<float*> (malloc (frames * sizeof (float)));
-               if (!_data[i]) {
-                       throw bad_alloc ();
-               }
-       }
+       allocate (channels, frames);
 }
 
 /** Copy constructor.
  *  @param other Other AudioBuffers; data is copied.
  */
 AudioBuffers::AudioBuffers (AudioBuffers const & other)
-       : _channels (other._channels)
-       , _frames (other._frames)
-       , _allocated_frames (other._frames)
 {
-       _data = static_cast<float**> (malloc (_channels * sizeof (float *)));
-       if (!_data) {
-               throw bad_alloc ();
-       }
-       
-       for (int i = 0; i < _channels; ++i) {
-               _data[i] = static_cast<float*> (malloc (_frames * sizeof (float)));
-               if (!_data[i]) {
-                       throw bad_alloc ();
-               }
-               memcpy (_data[i], other._data[i], _frames * sizeof (float));
-       }
+       allocate (other._channels, other._frames);
+       copy_from (&other, other._frames, 0, 0);
 }
 
 /* XXX: it's a shame that this is a copy-and-paste of the above;
    probably fixable with c++0x.
 */
 AudioBuffers::AudioBuffers (boost::shared_ptr<const AudioBuffers> other)
-       : _channels (other->_channels)
-       , _frames (other->_frames)
-       , _allocated_frames (other->_frames)
 {
+       allocate (other->_channels, other->_frames);
+       copy_from (other.get(), other->_frames, 0, 0);
+}
+
+AudioBuffers &
+AudioBuffers::operator= (AudioBuffers const & other)
+{
+       if (this == &other) {
+               return *this;
+       }
+               
+       deallocate ();
+       allocate (other._channels, other._frames);
+       copy_from (&other, other._frames, 0, 0);
+
+       return *this;
+}
+
+/** AudioBuffers destructor */
+AudioBuffers::~AudioBuffers ()
+{
+       deallocate ();
+}
+
+void
+AudioBuffers::allocate (int channels, int frames)
+{
+       _channels = channels;
+       _frames = frames;
+       _allocated_frames = frames;
+       
        _data = static_cast<float**> (malloc (_channels * sizeof (float *)));
        if (!_data) {
                throw bad_alloc ();
        }
        
        for (int i = 0; i < _channels; ++i) {
-               _data[i] = static_cast<float*> (malloc (_frames * sizeof (float)));
+               _data[i] = static_cast<float*> (malloc (frames * sizeof (float)));
                if (!_data[i]) {
                        throw bad_alloc ();
                }
-               memcpy (_data[i], other->_data[i], _frames * sizeof (float));
        }
 }
 
-/** AudioBuffers destructor */
-AudioBuffers::~AudioBuffers ()
+void
+AudioBuffers::deallocate ()
 {
        for (int i = 0; i < _channels; ++i) {
                free (_data[i]);
index b450b83ec603f4ffd2f9e8ae578f0488cbf9972b..6b57bd142ff5bf674f75c78f2bf987ce7c0cc1a8 100644 (file)
@@ -30,6 +30,8 @@ public:
        AudioBuffers (boost::shared_ptr<const AudioBuffers>);
        ~AudioBuffers ();
 
+       AudioBuffers & operator= (AudioBuffers const &);
+
        void ensure_size (int);
 
        float** data () const {
@@ -58,6 +60,9 @@ public:
        void accumulate_frames (AudioBuffers const *, int read_offset, int write_offset, int frames);
 
 private:
+       void allocate (int, int);
+       void deallocate ();
+       
        /** Number of channels */
        int _channels;
        /** Number of frames (where a frame is one sample across all channels) */
index 791a9101b24bed0ca792049cf5bd24123b4c89a8..ce3a87f5efdb29b8a8555c06c7446dc7972705b9 100644 (file)
@@ -35,7 +35,7 @@ class Film;
 /** @class Job
  *  @brief A parent class to represent long-running tasks which are run in their own thread.
  */
-class Job : public boost::enable_shared_from_this<Job>
+class Job : public boost::enable_shared_from_this<Job>, public boost::noncopyable
 {
 public:
        Job (boost::shared_ptr<const Film>);