image.hh 4.69 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Copyright (C) 2001, 2003, 2004, 2005, 2006 EPITA Research and
// Development Laboratory
//
// This file is part of the Olena Library.  This library is free
// software; you can redistribute it and/or modify it under the terms
// of the GNU General Public License version 2 as published by the
// Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
Roland Levillain's avatar
Roland Levillain committed
15
16
17
// along with this library; see the file COPYING.  If not, write to
// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
// Boston, MA 02111-1307, USA.
18
19
20
21
22
23
24
25
26
27
28
//
// As a special exception, you may use this file as part of a free
// software library without restriction.  Specifically, if other files
// instantiate templates or use macros or inline functions from this
// file, or you compile this file and link it with other files to
// produce an executable, this file does not by itself cause the
// resulting executable to be covered by the GNU General Public
// License.  This exception does not however invalidate any other
// reasons why the executable file might be covered by the GNU General
// Public License.

29
30
#ifndef OLN_CORE_ABSTRACT_IMAGE_HH
# define OLN_CORE_ABSTRACT_IMAGE_HH
31

32
# include <oln/core/typedefs.hh>
33
# include <oln/core/abstract/fwd_decls.hh>
34
# include <oln/core/automatic/image/image.hh>
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56


namespace oln
{

  /*! \namespace oln::abstract
  ** \brief oln::abstract namespace.
  */
  namespace abstract {


    /*! \class abstract::image<E>
    **
    ** The abstract::image class is the base class from whom derives
    ** every concrete image class.  Basically, an image is a set of
    ** points and a set of values associated with those points.
    **
    ** Parameter E is the exact type of image.
    */


    template <typename E>
57
    struct image : public virtual stc::any__simple<E>,
58
		   public virtual oln::type,
59
		   public automatic::get_impl<image, E>
60
61
    {

62
    public:
63

64
65
      struct decl
      {
66
67
// 	oln_virtual_typedef(topo);
// 	oln_virtual_typedef(grid);
68

69
70
// 	oln_virtual_typedef(coord);

71
72
// 	oln_virtual_typedef(psite);
// 	oln_virtual_typedef(point);
73

74
75
76
// // 	oln_virtual_typedef(piter);
// // 	oln_virtual_typedef(fwd_piter);
// // 	oln_virtual_typedef(bkd_piter);
77

78
79
 	oln_virtual_typedef(is_computed);

80
81
// 	oln_virtual_typedef(value);
// 	oln_virtual_typedef(rvalue);
82

83
// 	oln_virtual_typedef(concrete);
84

85
// 	oln_virtual_typedef(morpher);
86

87
	decl();
88
      };
89
90


91
    private:
92

93
94
95
96
      /// Typedefs.
      typedef oln_type_of(E, topo)   topo_t;
      typedef oln_type_of(E, psite)  psite_t;
      typedef oln_type_of(E, rvalue) rvalue_t;
97
98


99
    public:
100
101

      /*------------------*
102
       ! abstract methods !
103
104
       *------------------*/

105
106
107
      /*! \brief Return the topological information about the current
      **  image.  Nota bene: this method is abstract-like.it is a
      **  pseudo-abstract method.
108
      **
109
110
111
      ** \return An object deriving from abstract::topo.  Ex: if the
      ** image is an image2d<something>, the returned object is a
      ** topo2d.
112
113
      */

114
      const topo_t& topo() const;
115
116
117


      /*! \brief Gives access to the value stored at \a p in the
118
      ** current image.
119
120
      */

121
      rvalue_t operator()(const psite_t& p) const;
122
123
124
125
126

    protected:

      /*! \brief Constructor (protected, empty).
      */
127
      image();
128

129
      /*! \brief Destructor.
130
      */
131
      virtual ~image();
132
133
134
135

    };


136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# ifndef OLN_INCLUDE_ONLY

    template <typename E>
    image<E>::decl::decl()
    {
// 	  mlc::assert_< mlc_is_a(topo,      abstract::topology)           >::check();
// 	  mlc::assert_< mlc_is_a(grid,      abstract::grid)               >::check();
// 	  mlc::assert_< mlc_is_a(piter,     abstract::iterator_on_points) >::check();
// 	  mlc::assert_< mlc_is_a(fwd_piter, abstract::iterator_on_points) >::check();
// 	  mlc::assert_< mlc_is_a(bkd_piter, abstract::iterator_on_points) >::check();
	  // FIXME: Rec.
	  // mlc::assert_< mlc_is_a(concrete,  abstract::image)              >::check();
    }

    template <typename E>
    image<E>::image()
    {
    }

    template <typename E>
    image<E>::~image()
    {
      decl();
    }

    template <typename E>
    const typename image<E>::topo_t&
    image<E>::topo() const
    {
      return this->exact().impl_topo();
    }

    template <typename E>
    typename image<E>::rvalue_t
    image<E>::operator()(const typename image<E>::psite_t& p) const
    {
      return this->exact().impl_op_read(p);
    }

# endif



179
180
181
182
183
  } // end of namespace oln::abstract

} // end of namespace oln


184
#endif // ! OLN_CORE_ABSTRACT_IMAGE_HH