1
#pragma once
2

            
3
#include "envoy/stats/stats.h"
4

            
5
#include "source/common/stats/metric_impl.h"
6

            
7
namespace Envoy {
8
namespace Stats {
9

            
10
/**
11
 * Null text readout implementation.
12
 * No-ops on all calls and requires no underlying metric or data.
13
 */
14
class NullTextReadoutImpl : public MetricImpl<TextReadout> {
15
public:
16
  explicit NullTextReadoutImpl(SymbolTable& symbol_table)
17
1836581
      : MetricImpl<TextReadout>(symbol_table), symbol_table_(symbol_table) {}
18
1836519
  ~NullTextReadoutImpl() override {
19
    // MetricImpl must be explicitly cleared() before destruction, otherwise it
20
    // will not be able to access the SymbolTable& to free the symbols. An RAII
21
    // alternative would be to store the SymbolTable reference in the
22
    // MetricImpl, costing 8 bytes per stat.
23
1836519
    MetricImpl::clear(symbol_table_);
24
1836519
  }
25

            
26
9
  void set(absl::string_view) override {}
27
10
  std::string value() const override { return {}; }
28

            
29
  // Metric
30
  bool used() const override { return false; }
31
  void markUnused() override {}
32
  bool hidden() const override { return false; }
33
25
  SymbolTable& symbolTable() override { return symbol_table_; }
34

            
35
  // RefcountInterface
36
  void incRefCount() override { refcount_helper_.incRefCount(); }
37
  bool decRefCount() override { return refcount_helper_.decRefCount(); }
38
  uint32_t use_count() const override { return refcount_helper_.use_count(); }
39

            
40
private:
41
  RefcountHelper refcount_helper_;
42
  SymbolTable& symbol_table_;
43
};
44

            
45
} // namespace Stats
46
} // namespace Envoy