1#pragma once
2#include <iostream>
3
4namespace DB
5{
6
7// Use template to disable implicit casting for certain overloaded types such as Field, which leads
8// to overload resolution ambiguity.
9class Field;
10template <typename T, typename U = std::enable_if_t<std::is_same_v<T, Field>>>
11std::ostream & operator<<(std::ostream & stream, const T & what);
12
13class IBlockInputStream;
14std::ostream & operator<<(std::ostream & stream, const IBlockInputStream & what);
15
16struct NameAndTypePair;
17std::ostream & operator<<(std::ostream & stream, const NameAndTypePair & what);
18
19class IDataType;
20std::ostream & operator<<(std::ostream & stream, const IDataType & what);
21
22class IStorage;
23std::ostream & operator<<(std::ostream & stream, const IStorage & what);
24
25class TableStructureReadLock;
26std::ostream & operator<<(std::ostream & stream, const TableStructureReadLock & what);
27
28class IFunctionOverloadResolver;
29std::ostream & operator<<(std::ostream & stream, const IFunctionOverloadResolver & what);
30
31class IFunctionBase;
32std::ostream & operator<<(std::ostream & stream, const IFunctionBase & what);
33
34class Block;
35std::ostream & operator<<(std::ostream & stream, const Block & what);
36
37struct ColumnWithTypeAndName;
38std::ostream & operator<<(std::ostream & stream, const ColumnWithTypeAndName & what);
39
40class IColumn;
41std::ostream & operator<<(std::ostream & stream, const IColumn & what);
42
43struct Packet;
44std::ostream & operator<<(std::ostream & stream, const Packet & what);
45
46struct ExpressionAction;
47std::ostream & operator<<(std::ostream & stream, const ExpressionAction & what);
48
49class ExpressionActions;
50std::ostream & operator<<(std::ostream & stream, const ExpressionActions & what);
51
52struct SyntaxAnalyzerResult;
53std::ostream & operator<<(std::ostream & stream, const SyntaxAnalyzerResult & what);
54}
55
56/// some operator<< should be declared before operator<<(... std::shared_ptr<>)
57#include <common/iostream_debug_helpers.h>
58