g2o
Loading...
Searching...
No Matches
stream_redirect.cpp
Go to the documentation of this file.
1// g2o - General Graph Optimization
2// Copyright (C) 2011 R. Kuemmerle, G. Grisetti, W. Burgard
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright notice,
10// this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above copyright
12// notice, this list of conditions and the following disclaimer in the
13// documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
18// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27#include "stream_redirect.h"
28
29#include <QPlainTextEdit>
30#include <QString>
31#include <iostream>
32using namespace std;
33
34StreamRedirect::StreamRedirect(std::ostream& stream, QPlainTextEdit* te)
35 : _stream(stream), _te(te) {
36 _old_buf = stream.rdbuf();
37 _stream.rdbuf(this);
38}
39
41 if (!_buffer.empty()) xsputn(_buffer.c_str(), _buffer.size());
42 _stream.rdbuf(_old_buf);
43}
44
45std::char_traits<char>::int_type StreamRedirect::overflow(int_type v) {
46 _mutex.lock();
47 if (v == '\n') {
48 _te->appendPlainText(QString::fromLatin1(_buffer.c_str(), _buffer.size()));
49 _buffer.clear();
50 } else
51 _buffer.push_back(v);
52
53 _mutex.unlock();
54 return v;
55}
56
57std::streamsize StreamRedirect::xsputn(const char* p, std::streamsize n) {
58 _mutex.lock();
59 _buffer.append(p, p + n);
60
61 while (1) {
62 std::string::size_type pos = _buffer.find('\n');
63 if (pos != std::string::npos) {
64 _te->appendPlainText(QString::fromLatin1(_buffer.c_str(), pos));
65 _buffer.erase(_buffer.begin(), _buffer.begin() + pos + 1);
66 } else
67 break;
68 }
69
70 _mutex.unlock();
71 return n;
72}
StreamRedirect(std::ostream &stream, QPlainTextEdit *te)
std::char_traits< char >::int_type int_type
QPlainTextEdit * _te
std::string _buffer
std::streambuf * _old_buf
std::ostream & _stream
virtual std::char_traits< char >::int_type overflow(int_type v)
virtual std::streamsize xsputn(const char *p, std::streamsize n)
Definition jet.h:876