[vsipl++] Matlab IO
Assem Salama
assem at codesourcery.com
Mon Jun 19 10:13:19 UTC 2006
Stefan Seefeld wrote:
> Assem,
>
> I just checked in my png bits, so your patch may already get a bit smaller.
>
> Assem Salama wrote:
>
>
>> + // generic reader that allows us to read a generic type and cast to another
>> +
>> + // the read function for real or complex depending of the view that was
>> + // passed in
>> + template <typename T1,
>> + typename T2,
>> + typename ViewT>
>> + void read(std::istream& is,ViewT v)
>> + {
>> + vsip::dimension_type const View_dim = ViewT::dim;
>> + vsip::Index<View_dim> my_index;
>> + vsip::impl::Length<View_dim> v_extent = extent(v);
>> + T1 data;
>> +
>> + // get num_points
>> + vsip::length_type num_points = v.size();
>> +
>> + // read all the points
>> + for(vsip::index_type i=0;i<num_points;i++) {
>> + is.read(reinterpret_cast<char*>(&data),sizeof(data));
>> + put(v,my_index,T2(data));
>> +
>> + // increment index
>> + my_index = vsip::impl::next(v_extent,my_index);
>> + }
>> +
>> + }
>>
>
> What's the reason for you using the 'put' function here, instead of
> some v method ? And, why are you casting to T2 in that call, instead
> of casting to ViewT::value_type ? As it stands, the above read function
> takes three distinct type parameters: T1, T2, and ViewT::value_type.
> I think only two are required (and the first may default to ViewT::value_type,
> actually).
>
> How portable is the above code ? It doesn't appear to care for endianness,
> i.e. you cast between 'char *' and T2 without any endianness check. If you
> write on a big-endian machine, and read it back on a little-endian
> machine, you will thus get different values.
>
>
>> + // a write function to output a view to a matlab file.
>> + template <typename T,
>> + typename ViewT>
>> + void write(std::ostream& os,ViewT v)
>> + {
>> + vsip::dimension_type const View_dim = ViewT::dim;
>> + vsip::Index<View_dim> my_index;
>> + vsip::impl::Length<View_dim> v_extent = extent(v);
>> + T data;
>> +
>> + // get num_points
>> + vsip::length_type num_points = v.size();
>> +
>> + // write all the points
>> + for(vsip::index_type i=0;i<num_points;i++) {
>> + data = get(v,my_index);
>> + os.write(reinterpret_cast<char*>(&data),sizeof(data));
>>
>
> The same point about endianness applies here.
>
I disagree. We can write in either endian format and we chose to write
in the native format of the machine.
>
>
>> +
>> + // increment index
>> + my_index = vsip::impl::next(v_extent,my_index);
>> + }
>> +
>> + }
>>
>
> Thanks,
> Stefan
>
>
More information about the vsipl++
mailing list