Boost logo

Boost :

From: Maarten Kronenburg (M.Kronenburg_at_[hidden])
Date: 2006-06-04 08:23:30


Rene,
The user can define an iterator with
the bit access functions
highest_bit and get_sub.
The get_sub is O(1) when nbits is limited.
Then the user must define what is iterated
over, bits or bytes or words or...
The integer class is not a template,
because templates do not provide
run-time polymorphism.
Regards, Maarten.

"Rene Rivera" <grafik.list_at_[hidden]> wrote in message
news:447FA7B1.4080800_at_redshift-software.com...
> Maarten Kronenburg wrote:
> > "Rene Rivera" wrote in message
> >> I don't care that much what the form of access looks like. The
important
> >> aspect is having a *defined representation* that users can convert to
> >> and from. For example other access methods might be:
> >>
> >> // Iterators, like std::string::data:
> >> std::pair<word_type const *, word_type const *> integer::data() const;
> >>
> >> // Inserter, like std::string::copy:
> >> template <typename OutputIterator>
> >> void integer::copy(OutputIterator) const;
> >>
> >> // Stream like:
> >> template <typename Container>
> >> operator << (Container &, integer const &);
> >>
> >> Of course there would need to be a corresponding constructor to have
the
> >> data round trip.
> >
> > But what should the iterator iterate over?
> > Bits? Bytes?
>
> A "word_type" you define, which at minimum would be bytes. And by you I
> mean the TR2 document you are proposing.
>
> > In my opinion get_sub of a bit or byte or whatever,
> > with a converter like to_unsigned_int, gives you the
> > O(1) access you require.
>
> Sure, but it doesn't follow existing STL practices and norms.
>
> > Perhaps the user can define an iterator
> > based on get_sub.
>
> Of course, it's as simple as:
>
> ====
> typedef
> boost::transform_iterator<
> boost::function< uint8_t (std::size_t) >,
> boost::counting_iterator<std::size_t> > I;
>
> integer n = 5;
>
> uint8_t get_uint8_n(integer * i, std::size_t n)
> {
> return i->get_sub(n*8,8);
> }
>
> I begin_i(I::base_type(0),boost::bind(&get_uint8_n,&n,_1));
> I end_i(I::base_type(n.size(),boost::bind(&get_uint8_n,&n,_1,8));
>
> std::vector<uint8_t> m(begin_i,end_i);
> ====
>
> But first there's no integer::size(), and second it seems like a rather
> complex thing to push onto users (even given how simple the above is
> with the use of the Boost.Iterators and Boost.Bind libraries).
>
>
> --
> -- Grafik - Don't Assume Anything
> -- Redshift Software, Inc. - http://redshift-software.com
> -- rrivera/acm.org - grafik/redshift-software.com
> -- 102708583/icq - grafikrobot/aim - grafikrobot/yahoo
> _______________________________________________
> Unsubscribe & other changes:
http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk