00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 #ifndef MLN_CORE_INTERNAL_RUN_IMAGE_HH
00027 # define MLN_CORE_INTERNAL_RUN_IMAGE_HH
00028 
00034 # include <mln/core/internal/image_primary.hh>
00035 # include <mln/core/site_set/p_run.hh>
00036 # include <mln/core/site_set/p_set_of.hh>
00037 
00038 namespace mln
00039 {
00040 
00041   namespace internal
00042   {
00043 
00049     template <typename T, typename P, typename E>
00050     class run_image_ : public internal::image_primary< P, p_set_of< p_run<P> >, E >
00051     {
00052     protected:
00053       run_image_();
00054 
00055     public:
00064       float compression() const;
00065 
00071       void finalize();
00072 
00080       P point_at(const mln_psite(p_set_of< p_run<P> >)& ps) const;
00081 
00086       bool has(const mln_psite(p_set_of< p_run<P> >)& ps) const;
00087     };
00088 
00089 # ifndef MLN_INCLUDE_ONLY
00090 
00091     template <typename T, typename P, typename E>
00092     inline
00093     run_image_<T, P, E>::run_image_()
00094     {
00095     }
00096 
00097     template <typename T, typename P, typename E>
00098     inline
00099     float
00100     run_image_<T, P, E>::compression() const
00101     {
00102       return float(exact(this)->data_->memory_size()) /
00103         float (sizeof(T) * exact(this)->data_->domain_.bbox().nsites());
00104     }
00105 
00106     template <typename T, typename P, typename E>
00107     inline
00108     void
00109     run_image_<T, P, E>::finalize()
00110     {
00111       exact(this)->data_->finalize();
00112     }
00113 
00114     template <typename T, typename P, typename E>
00115     inline
00116     P
00117     run_image_<T, P, E>::point_at(const mln_psite(p_set_of< p_run<P> >)& ps) const
00118     {
00119       const E* ima = exact(this);
00120       mln_precondition(ps.index() < ima->data_->domain_.nsites());
00121       mln_precondition(ps.p().index() < ima->data_->domain_[ps.index()].length());
00122       return ima->data_->domain_[ps.index()][ps.p().index()];
00123     }
00124 
00125     template <typename T, typename P, typename E>
00126     inline
00127     bool
00128     run_image_<T, P, E>::has(const mln_psite(p_set_of< p_run<P> >)& ps) const
00129     {
00130       const E* ima = exact(this);
00131       if (!ima->is_valid())
00132         return false;
00133       else
00134         return (ps.index() < ima->data_->domain_.nsites()
00135                 && ps.p().index() < ima->data_->domain_[ps.index()].length()
00136                 && ima->data_->domain_[ps.index()][ps.p().index()] == ps);
00137     }
00138 
00139 # endif // ! MLN_INCLUDE_ONLY
00140 
00141   } 
00142 
00143 } 
00144 
00145 
00146 #endif // ! MLN_CORE_INTERNAL_RUN_IMAGE_HH