Boost logo

Ublas :

Subject: Re: [ublas] [bindings] Workspaces
From: Rutger ter Borg (rutger_at_[hidden])
Date: 2008-12-13 04:47:22

Thomas Klimpel wrote:
> we simply need a compile time way to tell whether a value_type is
> actually a complex value_type.

You mean something such as is_complex<T>,

>> I have thought of that. Since the value_type of the arrays are fixed
>> anyway that should be quite easy to do.
> It may be easy to do (if you know how to do it),

I think the facilities provided by Boost.Fusion would make it easy indeed,
this would make it look like

template< typename A, typename B, typename C >
struct workspace3 {

  typedef typename fusion::map<
    fusion::pair< typename traits::value_type< A >, A& >,
    fusion::pair< typename traits::value_type< B >, B& >,
    fusion::pair< typename traits::value_type< C >, C& > > map_type;

  workspace3( A& a, B& b, C& c ):
    m_map( fusion::map_tie<
             traits::value_type< A >,
             traits::value_type< B >
             traits::value_type< C > >( a, b, c ) );

  template< typename V >
  fusion::result_of::at_key< map_type, V >::type get_array_of() {
    return fusion::at_key<V>(m_map);

  map_type m_map;

I haven't checked whether the above compiles, but it should be almost there.
Now this should give us, for an instantiated workspace3, access by
value_type to the workspace arrays,

... work.get_array_of< std::complex >();
... work.get_array_of< double >();
... work.get_array_of< int >();

> semantic. Whether workspace( a, b, c ) returns a boost::tuple<A&, B&,
> C&> or a workspace3<A,B,C> (or something completely different) is less
> important to me. Just to be clear, workspace( a, b ) would return
> boost::tuple<A&, B&> or a workspace2<A,B> and workspace( a ) would
> return boost::tuple<A&> or a workspace1<A>.

In this case, when returning tuples, we would loose the information that the
argument passed is actually a workspace-type. It could be that we still
need that information at some point.