YAGE  v0.3.1
Yet Another Game Engine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
logsink.h
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2  * logsink.h
3  *
4  * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com>
5  * MIT License, see LICENSE file for more details.
6  * ----------------------------------------------------------------------------
7  */
8 
9 #ifndef YAGE_CORE_LOGSINK_H
10 #define YAGE_CORE_LOGSINK_H
11 
12 #include "logmessage.h"
13 
14 #include <memory>
15 #include <string>
16 
17 namespace yage
18 {
19 
20 class LogSink
21 {
22 public:
23  template <typename T>
24  LogSink(T impl);
25 
26  LogSink(const LogSink &sink);
27  LogSink(LogSink &&sink);
28 
29  LogSink &operator=(const LogSink &sink);
30  LogSink &operator=(LogSink &&sink);
31  bool operator==(const LogSink &sink);
32 
33  void write(const LogMessage::Meta &meta, const std::string &msg) const;
34 
35 private:
36  struct Concept {
37  virtual ~Concept() = default;
38 
39  virtual Concept *clone() const = 0;
40  virtual void write(const LogMessage::Meta &meta,
41  const std::string &msg) const = 0;
42  };
43 
44  template <typename T>
45  struct Model : Concept {
46  Model(T impl_i);
47  virtual Concept *clone() const override;
48  virtual void write(const LogMessage::Meta &meta,
49  const std::string &msg) const override;
50 
51  T impl;
52  };
53 
54  std::unique_ptr<Concept> wrapper_;
55 };
56 
58 
59 LogSink makeFileSink(const std::string &filename);
60 LogSink makeFileSink(std::string &&filename);
61 
62 /* -----------------------------------------------------------------------------
63  * Template Implementation
64  * -----------------------------------------------------------------------------
65  */
66 
67 template <typename T>
68 LogSink::LogSink(T impl) : wrapper_(new Model<T>(std::move(impl)))
69 {
70 }
71 
72 template <typename T>
73 LogSink::Model<T>::Model(T impl_i) : impl(impl_i)
74 {
75 }
76 
77 template <typename T>
79 {
80  return new Model<T>(impl);
81 }
82 
83 template <typename T>
85  const std::string &msg) const
86 {
87  impl(meta, msg);
88 }
89 
90 } // namespace yage
91 
92 #endif
std::unique_ptr< Concept > wrapper_
Definition: logsink.h:54
virtual Concept * clone() const override
Definition: logsink.h:78
T impl
Definition: logsink.h:51
virtual void write(const LogMessage::Meta &meta, const std::string &msg) const override
Definition: logsink.h:84
LogSink makeConsoleSink()
Definition: logsink.cpp:46
LogSink(T impl)
Definition: logsink.h:68
LogSink makeFileSink(const std::string &filename)
Definition: logsink.cpp:95
Model(T impl_i)
Definition: logsink.h:73
void write(const LogMessage::Meta &meta, const std::string &msg) const
Definition: logsink.cpp:41
virtual Concept * clone() const =0
Definition: logsink.h:36
virtual ~Concept()=default
LogSink & operator=(const LogSink &sink)
Definition: logsink.cpp:24
virtual void write(const LogMessage::Meta &meta, const std::string &msg) const =0
Definition: logmessage.h:36
bool operator==(const LogSink &sink)
Definition: logsink.cpp:36
Definition: logsink.h:45
Definition: logsink.h:20