123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- //////////////////////////////////////////////////////////////////////////////
- //
- // (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost
- // Software License, Version 1.0. (See accompanying file
- // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- //
- // See http://www.boost.org/libs/interprocess for documentation.
- //
- //////////////////////////////////////////////////////////////////////////////
- #include <boost/interprocess/detail/config_begin.hpp>
- #include <boost/interprocess/streams/bufferstream.hpp>
- #include <sstream>
- #include <cstring>
- namespace boost{
- namespace interprocess{
- //Force instantiations to catch compile-time errors
- template class basic_bufferbuf<char>;
- template class basic_bufferstream<char>;
- template class basic_ibufferstream<char>;
- template class basic_obufferstream<char>;
- }}
- using namespace boost::interprocess;
- static int bufferstream_test()
- {
- //Static big enough buffer
- {
- const int BufSize = 10001;
- //This will be zero-initialized
- static char buffer [BufSize];
- bufferstream bufstream;
- if(bufstream.tellg() != std::streampos(0)){
- return 1;
- }
- if(bufstream.tellp() != std::streampos(0)){
- return 1;
- }
- std::stringstream std_stringstream;
- std::string str1, str2, str3("testline:");
- int number1, number2;
- //Make sure we have null in the last byte
- bufstream.buffer(buffer, BufSize-1);
- for(int i = 0; i < 100; ++i){
- bufstream << "testline: " << i << std::endl;
- std_stringstream << "testline: " << i << std::endl;
- }
- if(std::strcmp(buffer, std_stringstream.str().c_str()) != 0){
- return 1;
- }
- //We shouldn't have reached the end of the buffer writing
- if(bufstream.bad()){
- assert(0);
- return 1;
- }
- bufstream.buffer(buffer, BufSize-1);
- for(int i = 0; i < 100; ++i){
- bufstream >> str1 >> number1;
- std_stringstream >> str2 >> number2;
- if((str1 != str2) || (str1 != str3)){
- assert(0); return 1;
- }
- if((number1 != number2) || (number1 != i)){
- assert(0); return 1;
- }
- }
- //We shouldn't have reached the end of the buffer reading
- if(bufstream.eof()){
- assert(0);
- return 1;
- }
- }
- //Static small buffer. Check if buffer
- //overflow protection works.
- {
- const int BufSize = 101;
- //This will be zero-initialized
- static char buffer [BufSize];
- bufferstream bufstream;
- std::stringstream std_stringstream;
- std::string str1;
- int number1;
- //Make sure we have null in the last byte
- bufstream.buffer(buffer, BufSize-1);
- for(int i = 0; i < 100; ++i){
- bufstream << "testline: " << i << std::endl;
- std_stringstream << "testline: " << i << std::endl;
- }
- //Contents should be different
- if(std::strcmp(buffer, std_stringstream.str().c_str()) == 0){
- return 1;
- }
- //The stream shouldn't be in good health
- if(bufstream.good()){
- assert(0);
- return 1;
- }
- //The bad flag should be active. This indicates overflow attempt
- if(!bufstream.bad()){
- assert(0);
- return 1;
- }
- //Now let's test read overflow
- bufstream.clear();
- bufstream.buffer(buffer, BufSize-1);
- for(int i = 0; i < 100; ++i){
- bufstream >> str1 >> number1;
- }
- //The stream shouldn't be in good health
- if(bufstream.good()){
- assert(0);
- return 1;
- }
- //The eof flag indicates we have reached the end of the
- //buffer while reading
- if(!bufstream.eof()){
- assert(0);
- return 1;
- }
- }
- return 0;
- }
- int main ()
- {
- if(bufferstream_test()){
- return 1;
- }
- return 0;
- }
- #include <boost/interprocess/detail/config_end.hpp>
|