[vsipl++] Matlab IO Patch

Assem Salama assem at codesourcery.com
Mon Jun 5 18:59:27 UTC 2006


The reason that I have the comment is because I was planning on reading 
the array name into view_name_. I didn't know how to do that at the time 
so I just read it into a temporary array and commented out the part that 
didn't work. By leaving the comment in there for now, I will not forget 
that I was planning on fixing that part.

Thanks,
Assem Salama

Mark Mitchell wrote:
> Assem Salama wrote:
>
>   
>> +  // is this the same class?
>> +  if(!(m_view.array_flags[0] == 
>> +            (matlab::Matlab_header_traits<sizeof(scalar_type),
>> +                  std::numeric_limits<scalar_type>::is_signed,
>> +                  std::numeric_limits<scalar_type>::is_integer>::class_type)))
>> +    VSIP_IMPL_THROW(vsip::impl::unimplemented(
>> +      "Trying to read a matrix of a different class"));
>>     
>
>   
>> +  // do dimensions agree?
>> +  if(v_dim == 1) m_view.dim_header.size -= 4; // special case for vectors
>> +  if(v_dim != (m_view.dim_header.size/4))
>> +    VSIP_IMPL_THROW(vsip::impl::unimplemented(
>> +      "Trying to read a matrix of different dimensions"));
>>     
>
> "unimplemented" should only be use for things that we plan to implement,
> but haven't.  Do we really ever expect to read a matrix of the wrong
> size?  I think most of these things should just be errors, not
> unimplemented.
>
>   
>> +    /*
>> +    strncpy(mbf.view_name.data(),
>> +            reinterpret_cast<char*>(&m_view.array_name_header.size),
>> +	    length);
>> +    mbf.view_name[length] = 0;
>> +    */
>>     
>
> No commented-out code.  Assem, I know this has been pointed out before;
> please check your patches for this before submission.
>
>
>   
>> +    // Because we don't know how the data was stored, we need to instantiate
>> +    // generic_reader which can read a type and cast into a different one
>> +    if(temp_data_element.type == matlab::miINT8) 
>> +    {
>> +      if(i==0)matlab::read<int8_t,T,r_v>(is,subview::real(mbf.v));
>> +      else    matlab::read<int8_t,T,i_v>(is,subview::imag(mbf.v));
>> +    }
>> +    else if(temp_data_element.type == matlab::miUINT8) 
>> +    {
>> +      if(i==0)matlab::read<uint8_t,T,r_v>(is,subview::real(mbf.v));
>> +      else    matlab::read<uint8_t,T,i_v>(is,subview::imag(mbf.v));
>> +    }
>>     
>
> This cascase of if's could be a case statement, something like this:
>
>   istream (*fn)(istream&, subview::subview_type);
>   switch (temp_data_element.type) {
>     case matlab::miINT8:
>       fn = matlab::read<int8_t,T,r,v>;
>       break;
>     case matlab::miUINT8:
>       fn = matlab::read<uint8_t,T,r,v>;
>       break;
>     ...
>   }
>   if (i == 0)
>     fn(is,subview::real(mbf.v));
>   else
>     fn(is,subview::imag(mbf.v));
>
> I don't know if that's better; just suggesting it as possibly tidier.
>
>   
>> +  /// This struct is just used as a wrapper so that we can overload the
>> +  /// << operator
>> +  template <typename ViewT>
>> +  struct Matlab_text_formatter
>> +  {
>> +    Matlab_text_formatter(ViewT v) : v_(v), view_name_("a")  {}
>> +    Matlab_text_formatter(ViewT v,std::string name) :
>> +      v_(v), view_name_(name)  {}
>> +
>> +    ViewT v_;
>> +    std::string view_name_;
>> +  };
>>     
>
> Another approach, is to add a "write" function to Matlab_text_formatter:
>
>   void
>   Matlab_text_formatter::write(ostream& os) {
>     // Whatever is currently in operator<<
>   }
>
>   inline void
>   std::ostream& operator<<(std::ostream& os, Matlab_text_formater mf) {
>     mf.write(os);
>     return os;
>   }
>
> This is somewhat more "object-oriented".  One advantage is that you then
> have a useful comment for Matlab_text_formatter:
>
>   // A Matlab_text_formatter writes the contents of a view to a stream,
>   // using the Matlab file format.
>
>   




More information about the vsipl++ mailing list