image2d.hh

00001 // Copyright (C) 2001, 2002, 2003, 2004  EPITA Research and Development Laboratory
00002 //
00003 // This file is part of the Olena Library.  This library is free
00004 // software; you can redistribute it and/or modify it under the terms
00005 // of the GNU General Public License version 2 as published by the
00006 // Free Software Foundation.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this library; see the file COPYING.  If not, write to
00015 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
00016 // MA 02111-1307, USA.
00017 //
00018 // As a special exception, you may use this file as part of a free
00019 // software library without restriction.  Specifically, if other files
00020 // instantiate templates or use macros or inline functions from this
00021 // file, or you compile this file and link it with other files to
00022 // produce an executable, this file does not by itself cause the
00023 // resulting executable to be covered by the GNU General Public
00024 // License.  This exception does not however invalidate any other
00025 // reasons why the executable file might be covered by the GNU General
00026 // Public License.
00027 
00028 #ifndef OLENA_CORE_IMAGE2D_HH
00029 # define OLENA_CORE_IMAGE2D_HH
00030 
00031 # include <oln/core/point2d.hh>
00032 # include <oln/core/dpoint2d.hh>
00033 # include <oln/core/fwd_iter2d.hh>
00034 # include <oln/core/bkd_iter2d.hh>
00035 # include <oln/core/impl/image_array2d.hh>
00036 # include <oln/core/image.hh>
00037 # include <oln/io/readable.hh>
00038 
00039 # include <iostream>
00040 # include <stdlib.h>
00041 
00042 namespace oln {
00043 
00044   template<class T, class Exact = mlc::final>
00045   class image2d; // fwd_decl
00046 
00053   template<class T, class Exact>
00054   struct image_id<image2d<T, Exact> >
00055   {
00056     enum{dim = 2};
00057     typedef T value_type;
00058     typedef typename mlc::exact_vt<image2d<T, Exact>, Exact>::ret exact_type;
00059     typedef impl::image_array2d<T> impl_type;
00060     typedef point2d point_type;
00061     typedef image2d_size size_type;
00062   };
00063 
00070   template<class T, class Exact>
00071   struct image_traits<image2d<T, Exact> >:
00072     public image_traits<image<image_id<image2d<T, Exact> >::dim,
00073                               typename image_id<image2d<T, Exact> >::value_type,
00074                               typename image_id<image2d<T, Exact> >::impl_type,
00075                               typename image_id<image2d<T, Exact> >::exact_type> >
00076   {};
00077 
00078   // client can use image2d; instances are real images, that is,
00079   // images with data ---conversely to proxy images
00080 
00088   template<class T, class Exact>
00089   class image2d:
00090     public image<image_id<image2d<T, Exact> >::dim,
00091                  typename image_id<image2d<T, Exact> >::value_type,
00092                  typename image_id<image2d<T, Exact> >::impl_type,
00093                  typename image_id<image2d<T, Exact> >::exact_type>
00094   {
00095 
00096   public:
00097 
00098     typedef image2d<T, Exact> self_type;
00099     typedef typename image_id<image2d<T, Exact> >::value_type value_type;
00100     typedef typename image_id<image2d<T, Exact> >::exact_type exact_type;
00101     typedef typename image_id<image2d<T, Exact> >::impl_type impl_type;
00102     typedef oln::image<image_id<image2d<T, Exact> >::dim,
00103                        value_type,
00104                        impl_type,
00105                        exact_type> super_type;
00106 
00107     friend class abstract::image<exact_type>;
00108 
00109 
00110     image2d() :
00111       super_type()
00112     {
00113       mlc_init_static_hierarchy(Exact);
00114     }
00115 
00116 
00123     image2d(coord nrows, coord ncols, coord border = 2) :
00124       super_type(new impl_type(image2d_size(nrows, ncols, border)))
00125     {
00126       mlc_init_static_hierarchy(Exact);
00127     }
00128 
00133     image2d(const image2d_size& size) :
00134       super_type(new impl_type(size))
00135     {
00136       mlc_init_static_hierarchy(Exact);
00137     }
00138 
00147     image2d(self_type& rhs) : // shallow copy
00148       super_type(rhs)
00149     {
00150       mlc_init_static_hierarchy(Exact);
00151     }
00152 
00153     // io
00161     image2d(const io::internal::anything& r)
00162       : super_type()
00163     {
00164       mlc_init_static_hierarchy(Exact);
00165       r.assign(*this);
00166     }
00167 
00175     image2d&
00176     operator=(const io::internal::anything& r)
00177     {
00178       return r.assign(*this);
00179     }
00180 
00188     exact_type&
00189     operator=(self_type rhs)
00190     {
00191       return this->exact().assign(rhs.exact());
00192     }
00193 
00194     static std::string
00195     name()
00196     {
00197       return
00198         std::string("image2d<")
00199         + ntg_name(T) + ","
00200         + Exact::name() + ">";
00201     }
00202 
00204 
00205     template<class U>
00206     struct mute
00207     {
00208       typedef image2d<U> ret;
00209     };
00210 
00211     image2d(const self_type& rhs); // w/o impl
00212 
00213   protected:
00214 
00216     exact_type
00217     clone_() const
00218     {
00219       exact_type output(this->nrows(), this->ncols(), this->border());
00220       clone_to(output.impl());
00221       return output;
00222     }
00223 
00224   };
00225 
00231   template <class T, class Exact>
00232   struct dim_traits<2, T, Exact>
00233   {
00234     typedef image2d<T, Exact> img_type;
00235   };
00236 } // end of oln
00237 
00238 #endif // ! OLENA_CORE_IMAGE2D_HH

Generated on Thu Apr 15 20:13:11 2004 for Olena by doxygen 1.3.6-20040222