ELsev_

ELseverityLevel

Macros

Line Code
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
#ifndef DataFormats_Common_ELseverityLevel_h
#define DataFormats_Common_ELseverityLevel_h

// ----------------------------------------------------------------------
//
// ELseverityLevel.h - declare objects that encode a message's urgency
//
//	Both frameworker and user will often pass one of the
//	instantiated severity levels to logger methods.
//
//	The only other methods of ELseverityLevel a frameworker
//	might use is to check the relative level of two severities
//	using operator< or the like.
//
// ----------------------------------------------------------------------

#include <string_view>
#include <cassert>

namespace edm {

  // ----------------------------------------------------------------------
  // ELseverityLevel:
  // ----------------------------------------------------------------------

  class ELseverityLevel {
  public:
    // ---  One ELseverityLevel is globally instantiated (see below)
    // ---  for each of the following levels:
    //
    enum ELsev_ {
      ELsev_noValueAssigned = 0,  // default returned by map when not found
      ELsev_zeroSeverity,         // threshold use only
      ELsev_success,              // report reaching a milestone
      ELsev_info,                 // information
      ELsev_fwkInfo,              // framework
      ELsev_warning,              // warning
      ELsev_error,                // error detected
      ELsev_unspecified,          // severity was not specified
      ELsev_severe,               // future results are suspect
      ELsev_highestSeverity,      // threshold use only
      // -----
      nLevels  // how many levels?
    };  // ELsev_

    // -----  Birth/death:
    //
    constexpr ELseverityLevel(ELsev_ lev = ELsev_unspecified) noexcept : myLevel(lev) {}
    constexpr ELseverityLevel(int lev) noexcept : myLevel(lev) {
      assert(lev >= ELsev_noValueAssigned);
      assert(lev < nLevels);
    }
    ~ELseverityLevel() noexcept = default;
    constexpr ELseverityLevel(const ELseverityLevel&) noexcept = default;
    constexpr ELseverityLevel(ELseverityLevel&&) noexcept = default;
    constexpr ELseverityLevel& operator=(const ELseverityLevel&) noexcept = default;
    constexpr ELseverityLevel& operator=(ELseverityLevel&&) noexcept = default;

    // -----  Comparator:
    //
    [[nodiscard]] constexpr int cmp(ELseverityLevel const& e) const noexcept { return myLevel - e.myLevel; }

    // -----  Accessors:
    //
    constexpr int getLevel() const noexcept { return myLevel; }
    std::string_view getName() const noexcept;

  private:
    // Data per ELseverityLevel object:
    //
    int myLevel;

  };  // ELseverityLevel

  // ----------------------------------------------------------------------
  // Declare the globally available severity objects,
  // one generator function and one proxy per non-default ELsev_:
  // ----------------------------------------------------------------------

  constexpr const ELseverityLevel ELzeroSeverity{ELseverityLevel::ELsev_zeroSeverity};

  constexpr const ELseverityLevel ELdebug{ELseverityLevel::ELsev_success};

  constexpr const ELseverityLevel ELinfo{ELseverityLevel::ELsev_info};

  constexpr const ELseverityLevel ELfwkInfo{ELseverityLevel::ELsev_fwkInfo};

  constexpr const ELseverityLevel ELwarning{ELseverityLevel::ELsev_warning};

  constexpr const ELseverityLevel ELerror{ELseverityLevel::ELsev_error};

  constexpr const ELseverityLevel ELunspecified{ELseverityLevel::ELsev_unspecified};

  constexpr const ELseverityLevel ELsevere{ELseverityLevel::ELsev_severe};

  constexpr const ELseverityLevel ELhighestSeverity{ELseverityLevel::ELsev_highestSeverity};

  // ----------------------------------------------------------------------
  // Comparators:
  // ----------------------------------------------------------------------

  constexpr inline bool operator==(ELseverityLevel const& e1, ELseverityLevel const& e2) noexcept {
    return e1.cmp(e2) == 0;
  }
  constexpr inline bool operator!=(ELseverityLevel const& e1, ELseverityLevel const& e2) noexcept {
    return e1.cmp(e2) != 0;
  }
  constexpr inline bool operator<(ELseverityLevel const& e1, ELseverityLevel const& e2) noexcept {
    return e1.cmp(e2) < 0;
  }
  constexpr inline bool operator<=(ELseverityLevel const& e1, ELseverityLevel const& e2) noexcept {
    return e1.cmp(e2) <= 0;
  }
  constexpr inline bool operator>(ELseverityLevel const& e1, ELseverityLevel const& e2) noexcept {
    return e1.cmp(e2) > 0;
  }
  constexpr inline bool operator>=(ELseverityLevel const& e1, ELseverityLevel const& e2) noexcept {
    return e1.cmp(e2) >= 0;
  }

  // ----------------------------------------------------------------------

}  // end of namespace edm

#endif  // DataFormats_Common_ELseverityLevel_h