arrays.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:15k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: arrays.h,v 1.3 2005/01/30 05:11:40 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Thomas Davies (Original Author), Peter Meerwald (pmeerw@users.sourceforge.net)
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  27. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  28. * the GPL or the LGPL are applicable instead of those above. If you wish to
  29. * allow use of your version of this file only under the terms of the either
  30. * the GPL or LGPL and not to allow others to use your version of this file
  31. * under the MPL, indicate your decision by deleting the provisions above
  32. * and replace them with the notice and other provisions required by the GPL
  33. * or LGPL. If you do not delete the provisions above, a recipient may use
  34. * your version of this file under the terms of any one of the MPL, the GPL
  35. * or the LGPL.
  36. * ***** END LICENSE BLOCK ***** */
  37. #ifndef _ARRAYS_H_
  38. #define _ARRAYS_H_
  39. //basic array types used for pictures etc
  40. #include <memory>
  41. #include <cstddef>
  42. #include <stdexcept>
  43. #include <iostream>
  44. #include <algorithm>
  45. namespace dirac
  46. {
  47.     typedef short ValueType;
  48.     typedef int CalcValueType;
  49.     //! Range type. 
  50.     /*!
  51.         Range type encapsulating a closed range of values [first,last]. 
  52.         Used to initialies OneDArrays.
  53.      */
  54.     class Range
  55.     {
  56.     public:
  57.         //! Constructor
  58.         /*!
  59.             Constructor taking a start and an end point for the range.
  60.          */
  61.         Range(int s, int e): m_fst(s), m_lst(e){}
  62.         //! Returns the start of the range.
  63.         const int First() const {return m_fst;}
  64.         //! Returns the end point of the range.
  65.         const int Last() const {return m_lst;}
  66.     private:
  67.         int m_fst ,m_lst;
  68.     };
  69.     //////////////////////////////
  70.     //One-Dimensional Array type//
  71.     //////////////////////////////
  72.     //! A template class for one-dimensional arrays.
  73.     /*!
  74.         A template class for one-D arrays. Can be used wherever built-in 
  75.         arrays are used, and eliminates the need for explicit memory 
  76.         (de-)allocation. Also supports arrays not based at zero.
  77.      */
  78.     template <class T> class OneDArray
  79.     {
  80.     public:
  81.         //! Default constructor.
  82.         /*!
  83.             Default constructor produces an empty array.
  84.          */    
  85.         OneDArray();
  86.         //! 'Length' constructor.
  87.         /*!
  88.             Length constructor produces a zero-based array.
  89.          */    
  90.         OneDArray(const int len);
  91.        //! Range constructor
  92.         /*!
  93.             Range constructor produces an array with values indexed within the 
  94.             range parameters.
  95.             param    r    a range of indexing values.
  96.          */        
  97.         OneDArray(const Range& r);
  98.         //! Destructor.
  99.         /*!
  100.             Destructor frees the data allocated in the constructors.
  101.          */
  102.         ~OneDArray()
  103.         {
  104.             FreePtr();
  105.         }
  106.         //! Copy constructor.
  107.         /*!
  108.             Copy constructor copies both data and metadata.
  109.          */
  110.         OneDArray(const OneDArray<T>& cpy);
  111.         //! Assignment=
  112.         /*!
  113.             Assignment= assigns both data and metadata.
  114.          */
  115.         OneDArray<T>& operator=(const OneDArray<T>& rhs);    
  116.         //! Resize the array, throwing away the current data.
  117.         void Resize(int l);
  118.         //! Element access.
  119.         T& operator[](const int pos){return m_ptr[pos-m_first];}
  120.         //! Element access.
  121.         const T& operator[](const int pos) const {return m_ptr[pos-m_first];}
  122.         //! Returns the length of the array.    
  123.         int Length() const {return m_length;}
  124.         //! Returns the index of the first element.    
  125.         int First() const {return m_first;}
  126.         //! Returns the index of the last element.    
  127.         int Last() const {return m_last;}
  128.     private:
  129.         void Init(const int len);
  130.         void Init(const Range& r);
  131.         void FreePtr();    
  132.         int m_first, m_last;
  133.         int m_length;
  134.         T* m_ptr;
  135.     };
  136.     //public member functions//
  137.     ///////////////////////////
  138.     template <class T>
  139.     OneDArray<T>::OneDArray()
  140.     {
  141.         Init(0);
  142.     }
  143.     template <class T>
  144.     OneDArray<T>::OneDArray(const int len)
  145.     {
  146.         Init(len);
  147.     }
  148.     template <class T>
  149.     OneDArray<T>::OneDArray(const Range& r)
  150.     {
  151.         Init(r);
  152.     }
  153.     template <class T>
  154.     OneDArray<T>::OneDArray(const OneDArray<T>& cpy)
  155.     {
  156.         m_first = cpy.m_first;
  157.         m_last = cpy.m_last;
  158.         m_length = m_last - m_first + 1;
  159.         if (m_first==0)
  160.             Init(m_length);
  161.         else
  162.             Init(Range(m_first , m_last));
  163.         memcpy( m_ptr , cpy.m_ptr , m_length * sizeof( T ) );
  164.     }
  165.     template <class T>
  166.     OneDArray<T>& OneDArray<T>::operator=(const OneDArray<T>& rhs)
  167.     {
  168.         if (&rhs != this)
  169.         {
  170.             FreePtr();
  171.             m_first = rhs.m_first;
  172.             m_last = rhs.m_last;
  173.             m_length = rhs.m_length;
  174.             if (m_first == 0)
  175.                 Init(m_length);
  176.             else
  177.                 Init(Range(m_first , m_last));
  178.             memcpy( m_ptr , rhs.m_ptr , m_length * sizeof( T ) );
  179.         }
  180.         return *this;
  181.     }
  182.     template <class T> 
  183.     void OneDArray<T>::Resize(int l)
  184.     {    
  185.         FreePtr();
  186.         Init(l);
  187.     }
  188.     //private member functions//
  189.     ////////////////////////////
  190.     template <class T>
  191.     void OneDArray<T>::Init(const int len)
  192.     {
  193.         Range r(0 , len-1);
  194.         Init(r);
  195.     }        
  196.     template <class T>
  197.     void OneDArray<T>::Init(const Range& r)
  198.     {
  199.         m_first = r.First();
  200.         m_last = r.Last();
  201.         m_length = m_last - m_first + 1; 
  202.         if ( m_length>0 ) 
  203.         {
  204.             m_ptr = new T[ m_length ];
  205.         }
  206.         else 
  207.         {
  208.             m_length = 0;
  209.             m_first = 0;
  210.             m_last = -1;
  211.         }
  212.     }
  213.     template <class T>
  214.     void OneDArray<T>::FreePtr()
  215.     {
  216.         if ( m_length>0 )
  217.             delete[] m_ptr;
  218.     }
  219.     //////////////////////////////
  220.     //Two-Dimensional Array type//
  221.     //////////////////////////////
  222.     //! A template class for two-dimensional arrays.
  223.     /*!
  224.         A template class to do two-d arrays, so that explicit memory 
  225.         (de-)allocation is not required. Only zero-based arrays are 
  226.         currently supported so that access is fast. The array is viewed as a 
  227.         (vertical) array of (horizontal) arrays. Accessing elements along 
  228.         a row is therefore much faster than accessing them along a column.
  229.      */
  230.     template <class T> class TwoDArray
  231.     {
  232.         typedef T* element_type;
  233.     public:
  234.         //! Default constructor.
  235.         /*!
  236.             Default constructor creates an empty array.
  237.          */    
  238.         TwoDArray(){ Init(0,0); }
  239.         //! Constructor.
  240.         /*!
  241.             The constructor creates an array of given width height.
  242.          */    
  243.         TwoDArray( const int height , const int width ){Init(height , width);}
  244.         //! Constructor.
  245.         /*!
  246.             The constructor creates an array of given width and length height 
  247.             and initialises it to a value
  248.          */    
  249.         TwoDArray( const int height , const int width , T val);
  250.         //! Destructor
  251.         /*!
  252.             Destructor frees the data allocated in the constructor.
  253.          */    
  254.         virtual ~TwoDArray(){
  255.             FreeData();    
  256.         }
  257.         //! Copy constructor.
  258.         /*!
  259.             Copy constructor copies data and metadata.
  260.          */    
  261.         TwoDArray(const TwoDArray<T>& Cpy);
  262.         //! Assignment =
  263.         /*!
  264.             Assignement = assigns both data and metadata.
  265.          */    
  266.         TwoDArray<T>& operator=(const TwoDArray<T>& rhs);
  267.         //! Resizes the array, deleting the current data.    
  268.         void Resize(const int height, const int width);    
  269.         //! Element access.
  270.         /*!
  271.             Accesses the rows of the arrays, which are returned in the form 
  272.             of pointers to the row data NOT OneDArray objects.
  273.          */    
  274.         inline element_type& operator[](const int pos){return m_array_of_rows[pos];}
  275.         //! Element access.
  276.         /*!
  277.             Accesses the rows of the arrays, which are returned in the form of 
  278.             pointers to the row data NOT OneDArray objects.
  279.          */
  280.         inline const element_type& operator[](const int pos) const {return m_array_of_rows[pos];}
  281.         //! Returns the width
  282.         const int LengthX() const { return m_length_x; }
  283.         //! Returns the height
  284.         const int LengthY() const { return m_length_y; }
  285.         //! Returns the index of the first element of a row
  286.         const int FirstX() const { return m_first_x; } 
  287.         //! Returns the index of the first element of a column
  288.         const int FirstY() const { return m_first_y; } 
  289.         //! Returns the index of the last element of a row
  290.         const int LastX() const { return m_last_x; } 
  291.         //! Returns the index of the first element of a column
  292.         const int LastY() const { return m_last_y; }
  293.     private:
  294.         //! Initialise the array
  295.         void Init(const int height,const int width);
  296.         //! Free all the allocated data
  297.         void FreeData();    
  298.         int m_first_x;
  299.         int m_first_y;
  300.         int m_last_x;
  301.         int m_last_y;
  302.         int m_length_x;
  303.         int m_length_y;
  304.         element_type* m_array_of_rows;
  305.     };
  306.     //public member functions//
  307.     ///////////////////////////
  308.     template <class T>
  309.     TwoDArray<T>::TwoDArray( const int height , const int width , const T val)
  310.     {
  311.         Init( height , width );  
  312.         for (int j=0 ; j<m_length_y ; ++j)
  313.             std::fill_n( m_array_of_rows[j] , m_length_x , val);
  314.     }  
  315.     template <class T>
  316.     TwoDArray<T>::TwoDArray(const TwoDArray<T>& Cpy)
  317.     {
  318.         m_first_x = Cpy.m_first_x;
  319.         m_first_y = Cpy.m_first_y;        
  320.         m_last_x = Cpy.m_last_x;
  321.         m_last_y = Cpy.m_last_y;
  322.         m_length_x = m_last_x - m_first_x + 1;
  323.         m_length_y = m_last_y - m_first_y + 1;        
  324.         if (m_first_x == 0 && m_first_y == 0)        
  325.             Init(m_length_y , m_length_x);
  326.         else{
  327.                 //based 2D arrays not yet supported    
  328.         }
  329.         for (int j=0 ; j<m_length_y ; ++j) 
  330.             memcpy( m_array_of_rows[j] , (Cpy.m_array_of_rows)[j] , m_length_x * sizeof( T ) ); 
  331.     }
  332.     template <class T>
  333.     TwoDArray<T>& TwoDArray<T>::operator=(const TwoDArray<T>& rhs)
  334.     {
  335.         if (&rhs != this)
  336.         {
  337.             FreeData();
  338.             m_first_x = rhs.m_first_x;
  339.             m_first_y = rhs.m_first_y;            
  340.             m_last_x = rhs.m_last_x;
  341.             m_last_y = rhs.m_last_y;
  342.             m_length_x = m_last_x - m_first_x + 1;
  343.             m_length_y = m_last_y - m_first_y + 1;        
  344.             if (m_first_x == 0 && m_first_y == 0)
  345.                 Init(m_length_y , m_length_x);
  346.             else
  347.             {
  348.                     //based 2D arrays not yet supported
  349.             }
  350.             for ( int j=0 ; j<m_length_y; ++j)
  351.                 memcpy( m_array_of_rows[j] , (rhs.m_array_of_rows)[j] , m_length_x * sizeof( T ) ); 
  352.         }
  353.         return *this;
  354.     }
  355.     template <class T>
  356.     void TwoDArray<T>::Resize(const int height, const int width)
  357.     {
  358.         FreeData();
  359.         Init(height , width);
  360.     }
  361.     //private member functions//
  362.     ////////////////////////////
  363.     template <class T>
  364.     void TwoDArray<T>::Init(const int height , const int width)
  365.     {
  366.         m_length_x = width; 
  367.         m_length_y = height;
  368.         m_first_x = 0;
  369.         m_first_y = 0;
  370.         m_last_x = m_length_x-1;
  371.         m_last_y = m_length_y-1;
  372.         if (m_length_y>0)
  373.         {
  374.             // allocate the array containing ptrs to all the rows
  375.             m_array_of_rows = new element_type[ m_length_y ];
  376.             if ( m_length_x>0 )
  377.             {
  378.                 // next, allocate all the rows
  379.                 for (int j=0 ; j<m_length_y ; ++j)
  380.                 {
  381.                     m_array_of_rows[j] = new T[ m_length_x ];
  382.                 }// j
  383.             }
  384.             else
  385.             {
  386.                 m_length_x = 0;
  387.                 m_first_x = 0;
  388.                 m_last_x = -1;
  389.             }
  390.         }
  391.         else 
  392.         {
  393.             m_length_x = 0;
  394.             m_length_y = 0;
  395.             m_first_x = 0;
  396.             m_first_y = 0;
  397.             m_last_x = -1;
  398.             m_last_y = -1;
  399.         }
  400.     }
  401.     template <class T>
  402.     void TwoDArray<T>::FreeData()
  403.     {
  404.         if (m_length_y>0)
  405.         {
  406.             if (m_length_x>0) 
  407.             {
  408.                 // deallocate each row
  409.                 for (int j=0 ; j<m_length_y ; ++j)
  410.                 {
  411.                     delete[]  m_array_of_rows[j];                
  412.                 }// j
  413.             }
  414.             // deallocate the array of rows
  415.             delete[] m_array_of_rows;
  416.         }    
  417.     }
  418.     // Related functions
  419.     //! A function for extracting array data
  420.     template <class T >
  421.     std::ostream & operator<< (std::ostream & stream, TwoDArray<T> & array)
  422.     {
  423.         for (int j=0 ; j<array.LengthY() ; ++j)
  424.         {
  425.             for (int i=0 ; i<array.LengthX() ; ++i)
  426.             {
  427.                 stream << array[j][i] << " ";
  428.             }// i
  429.             stream << std::endl;
  430.         }// j
  431.         return stream;
  432.     }
  433.     //! A function for inserting array data
  434.     template <class T >
  435.     std::istream & operator>> (std::istream & stream, TwoDArray<T> & array)
  436.     {
  437.         for (int j=0 ; j<array.LengthY() ; ++j)
  438.         {
  439.             for (int i=0 ; i<array.LengthX() ; ++i)
  440.             {
  441.                 stream >> array[j][i];
  442.             }// i
  443.         }// j
  444.         return stream;
  445.     }
  446. } //namespace dirac
  447. #endif