Hi Howard!

I like your idea. But (referring to the Nigel Stewart's posting) what would you
propose for the insert? Should I not provide it?

Jan

Howard Hinnant wrote:

> In article <[EMAIL PROTECTED]>, Alisdair Meredith
> <[EMAIL PROTECTED]> wrote:
>
> | "The one true circular buffer template" is a nigh impossible goal,
> | because it means so many things to different people.
> <snip>
> | I would certainly like the documentation to explain the tradeoffs made
> | in the implementation, and why this particular variation was chosen as
> | most appropriate for the general case.
>
> Indeed!  Excellent post!
>
> Perhaps container adaptors could be applied to a sufficiently
> generalized circular buffer.
>
> What is the one true queue?  There isn't one.  It is best a container
> adaptor (policy based if you prefer).  I suspect that a more general
> circular buffer, restricted by various adaptors, might serve more uses
> with less code.
>
> The circular buffer I've needed (and coded) fits none of aforementioned
> descriptions.  But it is a circular buffer nonetheless.
>
> For my money, the general circular buffer is one that exists in a
> contiguous array, but with an arbitrary begin and end within that
> array, capable of wrapping around the end of the physical memory:
>
> +---+---+---+---+---+---+---+---+---+---+
> | 4 | 5 |   |   |   |   | 0 | 1 | 2 | 3 |
> +---+---+---+---+---+---+---+---+---+---+
>           ^               ^
>           |               |
>          end            begin
>
> Constant time push/pop_front, constant time push/pop_back.  When begin
> and end collide, reallocation automatically happens vector-like.
>
> This data structure can be efficiently coded with a 4-word data
> structure.  For example:  data_ptr, capacity, size, begin_ptr  (there
> are other variations that also only take 4 words).
>
> >From this you can write adaptors to constrain capacity, have push_back
> overwrite front(), throw an exception on size() exceeding capacity(),
> or whatever else you need to do.
>
> You can't adapt any other std::container to do this job because vector
> is the only one with capacity, but vector doesn't have a constant time
> push/pop_front.  But I believe you can adapt the above described
> container to meet the needs of other "circular buffer" requirements.
> For example:
>
> template <class T, class Container = general_cyclic_buffer<T> >
> class my_cyclic_buffer
> {
> public:
>    // typedefs ...
>
>    my_cyclic_buffer(size_type cap) {c.reserve(cap);}
>
>    reference operator[](size_type n) {return c[n];}
>    // etc.
>
>    void push_back(const value_type& x)
>    {
>       if (capacity() != 0)
>       {
>          if (c.size() == c.capacity())
>             c.pop_front();
>          c.push_back(x);
>       }
>    }
>
>    change_capacity(size_type new_cap)
>    {
>       if (new_cap > c.capacity())
>          c.reserve(new_cap);
>       else if (new_cap < c.capacity())
>       {
>          c.erase(c.begin(), c.begin() + c.size() - new_cap);
>          Container tmp(c);  // assumes tmp.capacity() == c.size()
>          c.swap(tmp);
>       }
>    }
>    // etc.
>
> private:
>    Container c;
> };
>
> --
> Howard Hinnant
> Metrowerks
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

--
Jan Gaspar | [EMAIL PROTECTED]
Whitestein Technologies | www.whitestein.com
Panenska 28 | SK-81103 Bratislava | Slovak Republic
Tel +421(2)5930-0734 | Fax +421(2)5443-5512


_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to