// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // G4strstreambuf inline methods implementation // // Authors: H.Yoshida, M.Nagamatu - November 1998 // Revisions: G.Cosmo, 1998-2013 // -------------------------------------------------------------------- // -------------------------------------------------------------------- inline G4strstreambuf::G4strstreambuf() : std::basic_streambuf() { size = 4095; buffer = new char[size + 1]; } // -------------------------------------------------------------------- inline G4strstreambuf::~G4strstreambuf() { // flushing buffer... // std::cout is used because destination object may not be alive. if(count != 0) { buffer[count] = '\0'; std::cout << buffer; } delete[] buffer; } // -------------------------------------------------------------------- inline G4strstreambuf::G4strstreambuf(const G4strstreambuf& right) : std::basic_streambuf() , buffer(right.buffer) , count(right.count) , size(right.size) , destination(right.destination) {} // -------------------------------------------------------------------- inline G4strstreambuf& G4strstreambuf::operator=(const G4strstreambuf& right) { if(&right == this) return *this; destination = right.destination; buffer = right.buffer; count = right.count; size = right.size; return *this; } // -------------------------------------------------------------------- inline G4int G4strstreambuf::overflow(G4int c) { G4int result = 0; if(count >= size) result = sync(); buffer[count] = c; count++; return result; } // -------------------------------------------------------------------- inline G4int G4strstreambuf::sync() { buffer[count] = '\0'; count = 0; return ReceiveString(); } #ifdef WIN32 // -------------------------------------------------------------------- inline G4int G4strstreambuf::underflow() { return 0; } #endif // -------------------------------------------------------------------- inline void G4strstreambuf::SetDestination(G4coutDestination* dest) { destination = dest; } inline G4coutDestination* G4strstreambuf::GetDestination() const { return destination; } // -------------------------------------------------------------------- inline G4int G4strstreambuf::ReceiveString() { G4String stringToSend(buffer); G4int result = 0; if(this == &G4coutbuf && destination != nullptr) { result = destination->ReceiveG4cout_(stringToSend); } else if(this == &G4cerrbuf && destination != nullptr) { result = destination->ReceiveG4cerr_(stringToSend); } else if(this == &G4coutbuf && destination == nullptr) { std::cout << stringToSend << std::flush; result = 0; } else if(this == &G4cerrbuf && destination == nullptr) { std::cerr << stringToSend << std::flush; result = 0; } return result; }