On Monday, January 24, 2005 at 13:07:41 (-0600) Bill Lear writes:
On Monday, January 24, 2005 at 08:54:23 (-0800) Robert Ramey writes:
How does it fail? Does it fail to compile? Does it give an exception? If
so which one. If it fails with text or binary archive, does it also fail on
xml archives? that would be useful information.
I'll try to get together a complete test case by this evening.
Below is test code that shows the problem. It is working with text
and failing with XML serialization --- perhaps I'm simply not
understanding something else that I need to do, though we are using
XML serialization extensively.
The text serialization produces this as output:
22 serialization::archive 3 0 0 10 0 0 0 0 0 0 0 0 0 0 0 9
The XML serialization produces this as output:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<buff class_id="0" tracking_level="0" version="0">
std::vector<T>
<count>10</count>
<item>0</item>
<item>0</item>
<item>0</item>
<item>0</item>
<item>0</item>
<item>0</item>
<item>0</item>
<item>0</item>
<item>0</item>
<item>0</item>
<_first_ind>0
<_last_ind>9
</buff>
Following my sig is the code. The failure cases fail during the load.
This is the output:
% ./a.out
working_with_vector_text_archive()
working_with_ring_buffer_text_archive()
working_with_ring_buffer_pointer_text_archive()
failure_with_ring_buffer_pointer_xml_archive()
ERROR: stream error
failure_with_ring_buffer_xml_archive()
ERROR: stream error
Bill
#include <iostream>
#include <vector>
#include <fstream>
#include <stdexcept>
#include
#include
#include
#include
#include
#include
#include
template <class T>
class RingBuffer: private std::vector<T> {
public:
RingBuffer()
: _first_ind(0), _last_ind(0) {
}
double first() {
return (*this)[_first_ind];
}
double last() {
return (*this)[_last_ind];
}
void resize(size_t new_size) {
std::vector<T>::resize(new_size);
zero_fill();
}
void zero_fill() {
fill(begin(), end(), T());
_first_ind = 0;
_last_ind = size() - 1;
}
void add(T v) {
if (!size()) {
throw std::logic_error("add to a ring buffer of zero size");
}
_last_ind = (_last_ind + 1) % size();
(*this)[_last_ind] = v;
if (_last_ind == _first_ind) {
_first_ind = (_first_ind + 1) % size();
}
}
private:
int _first_ind;
int _last_ind;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int) {
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(std::vector<T>)
& BOOST_SERIALIZATION_NVP(_first_ind)
& BOOST_SERIALIZATION_NVP(_last_ind);
}
};
void working_with_vector_text_archive() {
std::cerr << "working_with_vector_text_archive()\n";
try {
std::vector<int> buff;
buff.resize(10);
std::ofstream out("buf.out");
boost::archive::text_oarchive oa(out);
oa << buff;
out.close();
std::ifstream in("buf.out");
boost::archive::text_iarchive ia(in);
std::vector<int> restored;
ia >> restored;
} catch (std::exception& e) {
std::cerr << "ERROR: " << e.what() << '\n';
}
}
void working_with_ring_buffer_text_archive() {
std::cerr << "working_with_ring_buffer_text_archive()\n";
try {
RingBuffer<int> buff;
buff.resize(10);
std::ofstream out("buf.out");
boost::archive::text_oarchive oa(out);
oa << buff;
out.close();
std::ifstream in("buf.out");
boost::archive::text_iarchive ia(in);
RingBuffer<int> restored;
ia >> restored;
} catch (std::exception& e) {
std::cerr << "ERROR: " << e.what() << '\n';
}
}
void working_with_ring_buffer_pointer_text_archive() {
std::cerr << "working_with_ring_buffer_pointer_text_archive()\n";
try {
RingBuffer<int> buff;
buff.resize(10);
std::ofstream out("buf.out");
boost::archive::text_oarchive oa(out);
oa << buff;
out.close();
std::ifstream in("buf.out");
boost::archive::text_iarchive ia(in);
RingBuffer<int>* restored;
ia >> restored;
} catch (std::exception& e) {
std::cerr << "ERROR: " << e.what() << '\n';
}
}
void failure_with_ring_buffer_pointer_xml_archive() {
std::cerr << "failure_with_ring_buffer_pointer_xml_archive()\n";
try {
RingBuffer<int> buff;
buff.resize(10);
std::ofstream out("buf.out");
boost::archive::xml_oarchive oa(out);
oa << BOOST_SERIALIZATION_NVP(buff);
out.close();
std::ifstream in("buf.out");
boost::archive::xml_iarchive ia(in);
RingBuffer<int>* restored;
ia >> BOOST_SERIALIZATION_NVP(restored);
} catch (std::exception& e) {
std::cerr << "ERROR: " << e.what() << '\n';
}
}
void failure_with_ring_buffer_xml_archive() {
std::cerr << "failure_with_ring_buffer_xml_archive()\n";
try {
RingBuffer<int> buff;
buff.resize(10);
std::ofstream out("buf.out");
boost::archive::xml_oarchive oa(out);
oa << BOOST_SERIALIZATION_NVP(buff);
out.close();
std::ifstream in("buf.out");
boost::archive::xml_iarchive ia(in);
RingBuffer<int> restored;
ia >> BOOST_SERIALIZATION_NVP(restored);
} catch (std::exception& e) {
std::cerr << "ERROR: " << e.what() << '\n';
}
}
int main() {
working_with_vector_text_archive();
working_with_ring_buffer_text_archive();
working_with_ring_buffer_pointer_text_archive();
failure_with_ring_buffer_pointer_xml_archive();
failure_with_ring_buffer_xml_archive();
}