1 /* Copyright (C) 2015-2021 Free Software Foundation, Inc. 2 3 This program is free software; you can redistribute it and/or modify 4 it under the terms of the GNU General Public License as published by 5 the Free Software Foundation; either version 3 of the License, or 6 (at your option) any later version. 7 8 This program is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License 14 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #ifndef GM_STD_H 17 #define GM_STD_H 18 19 #include <iostream> 20 21 namespace gm_std 22 { 23 24 // Mock std::cerr, so we don't have to worry about the vagaries of the 25 // system-provided one. E.g., gcc pr 65669. 26 // This contains just enough to exercise what we want to. 27 template<typename T> 28 class basic_ostream 29 { 30 public: 31 std::ostream *stream; 32 }; 33 34 template<typename T> 35 basic_ostream<T>& 36 operator<< (basic_ostream<T>& out, const char* s) 37 { 38 (*out.stream) << s; 39 return out; 40 } 41 42 typedef basic_ostream<char> ostream; 43 44 // Inhibit implicit instantiations for required instantiations, 45 // which are defined via explicit instantiations elsewhere. 46 extern template class basic_ostream<char>; 47 extern template ostream& operator<< (ostream&, const char*); 48 49 extern ostream cerr; 50 51 // Call this from main so we don't have to do the same tricks that 52 // libstcd++ does with ios init'n. 53 extern void init (); 54 55 } 56 57 #endif /* GM_STD_H */ 58