111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (c) 2015-2016 The Khronos Group Inc.
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Permission is hereby granted, free of charge, to any person obtaining a
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// copy of this software and/or associated documentation files (the
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// "Materials"), to deal in the Materials without restriction, including
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// without limitation the rights to use, copy, modify, merge, publish,
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// distribute, sublicense, and/or sell copies of the Materials, and to
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permit persons to whom the Materials are furnished to do so, subject to
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// the following conditions:
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The above copyright notice and this permission notice shall be included
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// in all copies or substantial portions of the Materials.
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//    https://www.khronos.org/registry/
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef LIBSPIRV_PRINT_H_
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define LIBSPIRV_PRINT_H_
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <iostream>
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sstream>
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace libspirv {
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Wrapper for out stream selection.
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass out_stream {
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public:
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  out_stream() : pStream(nullptr) {}
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  explicit out_stream(std::stringstream& stream) : pStream(&stream) {}
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::ostream& get() {
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (pStream) {
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *pStream;
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return std::cout;
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  }
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert private:
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  std::stringstream* pStream;
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace clr {
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Resets console color.
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct reset {
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  operator const char*();
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Sets console color to grey.
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct grey {
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  operator const char*();
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Sets console color to red.
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct red {
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  operator const char*();
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Sets console color to green.
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct green {
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  operator const char*();
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Sets console color to yellow.
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct yellow {
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  operator const char*();
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Sets console color to blue.
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct blue {
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  operator const char*();
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}  // namespace clr
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}  // namespace libspirv
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif  // LIBSPIRV_PRINT_H_
82