Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > реализация BidirectionalIterator


Автор: boostcoder 29.8.2011, 18:08
всем доброго дня.

для http://forum.vingrad.ru/forum/topic-336344.html(man`а) пытаюсь разобраться с требованиями для http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/ConstBufferSequence.html и для собственного итератора соответствующего требованиям http://cplusplus.com/reference/std/iterator/BidirectionalIterator/.

нарукоблудил такой код:
Код

#include <boost/asio.hpp>
#include <algorithm>

struct my_iterator {
   typedef boost::asio::const_buffer value_type;
   my_iterator() {}
   my_iterator(const my_iterator&) {}
   
   my_iterator& operator= (const my_iterator&) { return *this; }
   
   bool operator== (const my_iterator&) const { return true; }
   bool operator!= (const my_iterator& r) const { return !operator==(r); }
   
   value_type operator* () const { return value_type(); }
   
   my_iterator operator++ (int) {}
   my_iterator operator++ () {}
};

struct my_const_buffer_sequence {
   typedef boost::asio::const_buffer value_type;
   typedef my_iterator const_iterator;
   
   const_iterator begin() {}
   const_iterator end() {}
};

void handler(
   const boost::system::error_code& error, // Result of operation.
  std::size_t bytes_transferred            // Number of bytes written from the
                                           // buffers. If an error occurred,
                                           // this will be less than the sum
                                           // of the buffer sizes.
) {
}

int main() {
   boost::asio::io_service ios;
   boost::asio::ip::tcp::socket socket(ios);
   boost::asio::async_write(socket, my_const_buffer_sequence(), &handler);
}


http://liveworkspace.org/code/caf388f3bfbcc28b9e68474e64d4b1fc

сейчас получаю ошибку:
Цитата

boost/asio/detail/consuming_buffers.hpp:176:5: error: no matching function for call to 'distance(my_const_buffer_sequence::const_iterator&, my_const_buffer_sequence::const_iterator&)'
boost/asio/detail/consuming_buffers.hpp:176:5: note: candidate is:
include/c++/4.6.0/bits/stl_iterator_base_funcs.h:113:59: note: template<class _InputIterator> typename std::iterator_traits::difference_type std::distance(_InputIterator, _InputIterator)


дальше мыслей нет.
подскажите, что оно от меня кочет?

зы
коверкать русяз весьма прикольно бывает smile 

Автор: mes 29.8.2011, 20:09
Цитата(boostcoder @  29.8.2011,  17:08 Найти цитируемый пост)

дальше мыслей нет.
подскажите, что оно от меня кочет?

показывает, что не распознает класс как итератор.. наследование поможет.. 

Цитата(boostcoder @  29.8.2011,  17:08 Найти цитируемый пост)
с требованиями для ConstBufferSequence 

ну раз буффер константный begin() и end() нужно соотвественно пометить.. 


Автор: boostcoder 30.8.2011, 02:41
я, конечно, любитель лаконичности. но Ваш ответ -
Цитата(mes @  29.8.2011,  20:09 Найти цитируемый пост)
наследование поможет

даже меня повергает в тупик smile

Автор: mes 30.8.2011, 08:03
Цитата(boostcoder @  30.8.2011,  01:41 Найти цитируемый пост)
Цитата

наследование поможет


даже меня повергает в тупик

http://cplusplus.com/reference/std/iterator/iterator/
smile

P.S. а насчет лаконичности, нужно рассматривать цитату целиком :
Цитата(mes @  29.8.2011,  19:09 Найти цитируемый пост)
показывает, что не распознает класс как итератор.. наследование поможет.. 

т.е. наследование поможет распознать класс как итератор, и, я так понимаю, единственно напрашивающий вывод : отнаследовать от итераторной базы..
smile

Автор: Earnest 30.8.2011, 09:44
boostcoder, от тру-итератора требуется куча всяких определений типов и прочая. Либо наследуйся от подходящий базы, как посоветовал mes, либо посмотри на бустовские iterator-facade и iterator_adaptor - очень полезные классы; я все доморощенные итераторы через них делаю.

Автор: boostcoder 30.8.2011, 13:50
Цитата(Earnest @  30.8.2011,  09:44 Найти цитируемый пост)
либо посмотри на бустовские iterator-facade и iterator_adaptor

хм.. никогда не использовал...
я вообще, по моему впервые, задумался над реализацией и требованиями к итераторам.

Автор: Earnest 30.8.2011, 15:21
Дык пора уже - иначе какой ты бусткодер smile 
Действительно, классы полезные, и там же еще несколько полезных готовых итераторов-оберток типа counting_iterator. 
С помощью iterator_adapter можно, например, ограничить доступ к деталям контейнера в каком-то сложном объекте. Например, в контейнере хранятся какие-то объекты с кучей подробностей, но клиенту ты хочешь предоставить только часть этой информации, и вообще сделать так, чтобы он не знал о деталях устройства контейнера. Вот тут-то iterator_adaptor как нельзя более кстати.

Автор: boostcoder 30.8.2011, 15:29
Цитата(Earnest @  30.8.2011,  15:21 Найти цитируемый пост)
пора уже - иначе какой ты бусткодер

 smile 
раньше что-то задачи не было..

сижу - читаю...

Автор: boostcoder 30.8.2011, 16:27
наследованием, получился такой код:
Код

#include <boost/asio.hpp>

#include <iterator>
#include <algorithm>

struct my_iterator: std::iterator<std::bidirectional_iterator_tag, boost::asio::const_buffer> {
   bool operator== (const my_iterator&) const { return true; }
   bool operator != (const my_iterator& r) const { return operator==(r); }

   my_iterator operator++() { return *this; }
   my_iterator operator++(int) { return *this; }

   my_iterator operator--() { return *this; }
   my_iterator operator--(int) { return *this; }

   value_type operator* () const { return value_type(); }
};

struct my_const_buffer_sequence {
   typedef boost::asio::const_buffer value_type;
   typedef my_iterator const_iterator;
   
   const_iterator begin() const {}
   const_iterator end() const {}
};

void handler(
   const boost::system::error_code& error, // Result of operation.
   std::size_t bytes_transferred           // Number of bytes written from the
                                           // buffers. If an error occurred,
                                           // this will be less than the sum
                                           // of the buffer sizes.
) {
}

int main() {
   boost::asio::io_service ios;
   boost::asio::ip::tcp::socket socket(ios);
   boost::asio::async_write(socket, my_const_buffer_sequence(), &handler);
}


http://liveworkspace.org/code/6cd54ffb9aabae7da703376c760abd87

сейчас попробую с помощью http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/index.html.

Автор: boostcoder 30.8.2011, 17:04
Цитата(mes @  30.8.2011,  17:03 Найти цитируемый пост)
T  - Type of elements pointed by the iterator.

ну правильно. при разыменовании итератора я получаю boost::asio::const_buffer.
или что?

Добавлено через 30 секунд
эм.. пропал Ваш пост smile

Автор: mabrarov 30.8.2011, 23:13
Цитата(boostcoder @ 29.8.2011,  18:08)
для http://forum.vingrad.ru/forum/topic-336344.html(man`а) пытаюсь разобраться с требованиями для http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/reference/ConstBufferSequence.html и для собственного итератора соответствующего требованиям http://cplusplus.com/reference/std/iterator/BidirectionalIterator/.

Доброй ночи. 
Не в тему итераторов, но в тему Asio BufferSequence - http://asio-samples.svn.sourceforge.net/viewvc/asio-samples/trunk/include/ma/cyclic_buffer.hpp?revision=467&view=markup.

Автор: boostcoder 30.8.2011, 23:16
mabrarov, здравствуйте.
ma::cyclic_buffer я смотрел. даже понял что и как smile

но сия тема возникла в следствии непонимания(не умения?) реализовывать тип в соответствии с требованиями BidirerctionalIterator.
но вроде разобрался. закрою тему позже.

зы
по поводу критики/комментариев к http://forum.vingrad.ru/forum/topic-336344.html - все приветствуется smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)