166d00febSPaula Toth //===-- StreamWrapper.cpp -------------------------------------------------===//
21962bc1dSAlex Brachet //
31962bc1dSAlex Brachet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41962bc1dSAlex Brachet // See https://llvm.org/LICENSE.txt for license information.
51962bc1dSAlex Brachet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61962bc1dSAlex Brachet //
71962bc1dSAlex Brachet //===----------------------------------------------------------------------===//
81962bc1dSAlex Brachet 
91962bc1dSAlex Brachet #include "StreamWrapper.h"
101962bc1dSAlex Brachet #include <cassert>
11c6aa206bSSiva Chandra Reddy #include <fstream>
128a4ee355SMichael Jones #include <iostream>
131962bc1dSAlex Brachet #include <memory>
14d69cbd82SSiva Chandra Reddy #include <string>
151962bc1dSAlex Brachet 
161962bc1dSAlex Brachet namespace __llvm_libc {
171962bc1dSAlex Brachet namespace testutils {
181962bc1dSAlex Brachet 
outs()198a4ee355SMichael Jones StreamWrapper outs() { return {std::addressof(std::cout)}; }
201962bc1dSAlex Brachet 
operator <<(T t)211962bc1dSAlex Brachet template <typename T> StreamWrapper &StreamWrapper::operator<<(T t) {
22*25226f3eSMichael Jones   assert(os);
23*25226f3eSMichael Jones   std::ostream &Stream = *reinterpret_cast<std::ostream *>(os);
241962bc1dSAlex Brachet   Stream << t;
25c6aa206bSSiva Chandra Reddy   Stream.flush();
261962bc1dSAlex Brachet   return *this;
271962bc1dSAlex Brachet }
281962bc1dSAlex Brachet 
291348ca40SAlex Brachet template StreamWrapper &StreamWrapper::operator<<<void *>(void *t);
301962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<const char *>(const char *t);
311962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<char *>(char *t);
321962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<char>(char t);
331962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<short>(short t);
341962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<int>(int t);
351962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<long>(long t);
361962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<long long>(long long t);
371962bc1dSAlex Brachet template StreamWrapper &
381962bc1dSAlex Brachet     StreamWrapper::operator<<<unsigned char>(unsigned char t);
391962bc1dSAlex Brachet template StreamWrapper &
401962bc1dSAlex Brachet     StreamWrapper::operator<<<unsigned short>(unsigned short t);
411962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<unsigned int>(unsigned int t);
421962bc1dSAlex Brachet template StreamWrapper &
431962bc1dSAlex Brachet     StreamWrapper::operator<<<unsigned long>(unsigned long t);
441962bc1dSAlex Brachet template StreamWrapper &
451962bc1dSAlex Brachet     StreamWrapper::operator<<<unsigned long long>(unsigned long long t);
461962bc1dSAlex Brachet template StreamWrapper &StreamWrapper::operator<<<bool>(bool t);
47d69cbd82SSiva Chandra Reddy template StreamWrapper &StreamWrapper::operator<<<std::string>(std::string t);
48c6aa206bSSiva Chandra Reddy template StreamWrapper &StreamWrapper::operator<<<float>(float t);
49c6aa206bSSiva Chandra Reddy template StreamWrapper &StreamWrapper::operator<<<double>(double t);
50c6aa206bSSiva Chandra Reddy 
OutputFileStream(const char * FN)51c6aa206bSSiva Chandra Reddy OutputFileStream::OutputFileStream(const char *FN)
52c6aa206bSSiva Chandra Reddy     : StreamWrapper(new std::ofstream(FN)) {}
53c6aa206bSSiva Chandra Reddy 
~OutputFileStream()54c6aa206bSSiva Chandra Reddy OutputFileStream::~OutputFileStream() {
55*25226f3eSMichael Jones   delete reinterpret_cast<std::ofstream *>(os);
56c6aa206bSSiva Chandra Reddy }
571962bc1dSAlex Brachet 
581962bc1dSAlex Brachet } // namespace testutils
591962bc1dSAlex Brachet } // namespace __llvm_libc
60