File: ErrorCode.hpp

package info (click to toggle)
unilog 2.5-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 220 kB
  • sloc: cpp: 543; sh: 88; makefile: 31
file content (88 lines) | stat: -rw-r--r-- 2,767 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
 * Copyright 2019 Xilinx Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <fstream>
#include <iostream>
#include <map>
#include <memory>
#include <string>

#include "UniLogExport.hpp"

// MSVC NOTE: must not using namespace std; it trigger an error, 'byte':
// ambiguous symbol, because c++17 introduce std::byte and MSVC use byte
// internally
//
// using namespace std;

class ErrorCodeFactory;
class UNILOG_DLLESPEC ErrorCode {
public:
  ErrorCode() = delete;
  ErrorCode(const std::string &errID, const std::string &errDsp = "",
            const std::string &errDebugInfo = "")
      : errID_(errID), errDsp_(errDsp), _errDebugInfo_(errDebugInfo){};
  ErrorCode(const ErrorCode &errCode);

  const std::string &getErrID() const { return this->errID_; }
  const std::string &getErrDsp() const { return this->errDsp_; }
  const std::string &getErrDebugInfo() const;
  const std::string &getErrMsg() const {
    return this->errMsg_;
  }                            // non-violated read
  std::string extractErrMsg(); // violated read, it will destroy after read

  ErrorCode &operator<<(const std::string &errMsg);

private:
  std::string errID_;
  std::string errDsp_;
  std::string _errDebugInfo_;
  std::string errMsg_;
};

UNILOG_DLLESPEC
std::ostream &operator<<(std::ostream &os, ErrorCode &errCode);

class UNILOG_DLLESPEC ErrorCodeFactory {
public:
  static ErrorCodeFactory &Instance();
  void registerErrorCode(const std::string &errID,
                         std::shared_ptr<ErrorCode> errCodePtr);
  ErrorCode &genErrorCode(const std::string &errID);
  void
  dumpErrorCodeMap(const std::string &errMapFileName = "_ERRORCODE_MAP.csv");

private:
  ErrorCodeFactory() {}

private:
  std::map<std::string, std::shared_ptr<ErrorCode>> mapErrorCode_;
};

class UNILOG_DLLESPEC ErrorCodeRegister {
public:
  ErrorCodeRegister() = delete;
  ErrorCodeRegister(const std::string &errID, const std::string &errDsp = "",
                    const std::string &errDebugInfo = "");
};

#define REGISTER_ERROR_CODE(ERRID, ERRDSP, ERRDEBUGINFO)                       \
  static const ErrorCodeRegister ERRID##OBJ_(#ERRID, ERRDSP, ERRDEBUGINFO)

#define GEN_ERROR(ERRID) ErrorCodeFactory::Instance().genErrorCode(#ERRID)