# Global Metrics

path: .metrics.cyclomatic.sum
old: 175.0
new: 23.0
path: .metrics.cyclomatic.average
old: 4.861111111111111
new: 1.0952380952380951
path: .metrics.nom.functions
old: 32.0
new: 12.0
path: .metrics.nom.total
old: 32.0
new: 12.0
path: .metrics.mi.mi_original
old: -33.72358278373146
new: 33.61018920866083
path: .metrics.mi.mi_sei
old: -88.08375322147265
new: 2.4313822873761666
path: .metrics.mi.mi_visual_studio
old: 0.0
new: 19.655081408573583
path: .metrics.loc.blank
old: 118.0
new: 36.0
path: .metrics.loc.lloc
old: 309.0
new: 3.0
path: .metrics.loc.cloc
old: 50.0
new: 31.0
path: .metrics.loc.sloc
old: 840.0
new: 223.0
path: .metrics.loc.ploc
old: 672.0
new: 156.0
path: .metrics.nexits.sum
old: 29.0
new: 1.0
path: .metrics.nexits.average
old: 0.90625
new: 0.08333333333333333
path: .metrics.nargs.average
old: 4.625
new: 0.16666666666666666
path: .metrics.nargs.sum
old: 148.0
new: 2.0
path: .metrics.halstead.n1
old: 38.0
new: 16.0
path: .metrics.halstead.n2
old: 330.0
new: 138.0
path: .metrics.halstead.N2
old: 2262.0
new: 300.0
path: .metrics.halstead.level
old: 0.007678347061287169
new: 0.0575
path: .metrics.halstead.vocabulary
old: 368.0
new: 154.0
path: .metrics.halstead.effort
old: 5508205.618783908
new: 90613.6686900564
path: .metrics.halstead.N1
old: 2700.0
new: 417.0
path: .metrics.halstead.purity_ratio
old: 0.5965956421225264
new: 1.4574286960047242
path: .metrics.halstead.estimated_program_length
old: 2960.3075762119756
new: 1044.9763750353873
path: .metrics.halstead.difficulty
old: 130.23636363636365
new: 17.391304347826086
path: .metrics.halstead.volume
old: 42293.91442595489
new: 5210.285949678244
path: .metrics.halstead.length
old: 4962.0
new: 717.0
path: .metrics.halstead.bugs
old: 10.396460500489075
new: 0.6724725396862772
path: .metrics.halstead.time
old: 306011.42326577264
new: 5034.092705003134
path: .metrics.cognitive.average
old: 6.75
new: 0.0
path: .metrics.cognitive.sum
old: 216.0
new: 0.0

# Spaces Data

## Minimal test - lines (190, 198)

path: .spaces[2].metrics.halstead.N2
old: 28.0
new: 5.0
path: .spaces[2].metrics.halstead.effort
old: 2702.439475283252
new: 348.802449963173
path: .spaces[2].metrics.halstead.level
old: 0.0974025974025974
new: 0.17142857142857143
path: .spaces[2].metrics.halstead.n1
old: 11.0
new: 7.0
path: .spaces[2].metrics.halstead.purity_ratio
old: 1.7260197631988936
new: 1.3559095531425942
path: .spaces[2].metrics.halstead.volume
old: 263.22462421590114
new: 59.79470570797252
path: .spaces[2].metrics.halstead.difficulty
old: 10.266666666666667
new: 5.833333333333333
path: .spaces[2].metrics.halstead.estimated_program_length
old: 96.65710673913804
new: 24.406371956566694
path: .spaces[2].metrics.halstead.N1
old: 28.0
new: 13.0
path: .spaces[2].metrics.halstead.time
old: 150.1355264046251
new: 19.377913886842943
path: .spaces[2].metrics.halstead.n2
old: 15.0
new: 3.0
path: .spaces[2].metrics.halstead.length
old: 56.0
new: 18.0
path: .spaces[2].metrics.halstead.vocabulary
old: 26.0
new: 10.0
path: .spaces[2].metrics.halstead.bugs
old: 0.0646719658792217
new: 0.016517022602721167
path: .spaces[2].metrics.mi.mi_sei
old: 77.37843161312729
new: 88.26709657178249
path: .spaces[2].metrics.mi.mi_original
old: 105.96532153609662
new: 113.44219280377918
path: .spaces[2].metrics.mi.mi_visual_studio
old: 61.96802429011498
new: 66.34046362794105
path: .spaces[2].metrics.nargs.average
old: 4.0
new: 0.0
path: .spaces[2].metrics.nargs.sum
old: 4.0
new: 0.0
path: .spaces[2].metrics.cognitive.sum
old: 1.0
new: 0.0
path: .spaces[2].metrics.cognitive.average
old: 1.0
new: 0.0
path: .spaces[2].metrics.nexits.sum
old: 1.0
new: 0.0
path: .spaces[2].metrics.nexits.average
old: 1.0
new: 0.0
path: .spaces[2].metrics.cyclomatic.average
old: 2.0
new: 1.0
path: .spaces[2].metrics.cyclomatic.sum
old: 2.0
new: 3.0
path: .spaces[2].metrics.loc.ploc
old: 9.0
new: 7.0
path: .spaces[2].metrics.loc.lloc
old: 3.0
new: 0.0
path: .spaces[2].metrics.loc.blank
old: 0.0
new: 2.0
path: .spaces[2].metrics.nom.total
old: 1.0
new: 2.0
path: .spaces[2].metrics.nom.functions
old: 1.0
new: 2.0

### Code

    class nsVariant final : public nsVariantBase {
     public:
      NS_DECL_ISUPPORTS

      nsVariant() = default;

     private:
      ~nsVariant() = default;
    };

## Minimal test - lines (176, 188)

path: .spaces[1].metrics.halstead.vocabulary
old: 27.0
new: 15.0
path: .spaces[1].metrics.halstead.N2
old: 27.0
new: 9.0
path: .spaces[1].metrics.halstead.n2
old: 15.0
new: 7.0
path: .spaces[1].metrics.halstead.effort
old: 2875.7559613084654
new: 482.22192494368
path: .spaces[1].metrics.halstead.volume
old: 266.2737001211542
new: 93.76537429460444
path: .spaces[1].metrics.halstead.bugs
old: 0.06740830876865232
new: 0.02049793194218302
path: .spaces[1].metrics.halstead.difficulty
old: 10.8
new: 5.142857142857143
path: .spaces[1].metrics.halstead.N1
old: 29.0
new: 15.0
path: .spaces[1].metrics.halstead.length
old: 56.0
new: 24.0
path: .spaces[1].metrics.halstead.purity_ratio
old: 1.8146948025496723
new: 1.8188118522668013
path: .spaces[1].metrics.halstead.estimated_program_length
old: 101.62290894278166
new: 43.65148445440323
path: .spaces[1].metrics.halstead.time
old: 159.76422007269252
new: 26.790106941315557
path: .spaces[1].metrics.halstead.n1
old: 12.0
new: 8.0
path: .spaces[1].metrics.halstead.level
old: 0.0925925925925926
new: 0.1944444444444444
path: .spaces[1].metrics.loc.lloc
old: 3.0
new: 0.0
path: .spaces[1].metrics.loc.sloc
old: 8.0
new: 13.0
path: .spaces[1].metrics.loc.blank
old: 0.0
new: 3.0
path: .spaces[1].metrics.loc.ploc
old: 8.0
new: 10.0
path: .spaces[1].metrics.mi.mi_visual_studio
old: 63.04884119371826
new: 61.62320646838705
path: .spaces[1].metrics.mi.mi_original
old: 107.81351844125822
new: 105.37568306094188
path: .spaces[1].metrics.mi.mi_sei
old: 80.04481612279022
new: 76.52776310910416
path: .spaces[1].metrics.cyclomatic.average
old: 2.0
new: 1.0
path: .spaces[1].metrics.nargs.sum
old: 4.0
new: 0.0
path: .spaces[1].metrics.nargs.average
old: 4.0
new: 0.0
path: .spaces[1].metrics.cognitive.sum
old: 1.0
new: 0.0
path: .spaces[1].metrics.cognitive.average
old: 1.0
new: 0.0
path: .spaces[1].metrics.nexits.sum
old: 1.0
new: 0.0
path: .spaces[1].metrics.nexits.average
old: 1.0
new: 0.0

### Code

    class nsVariantBase : public nsIWritableVariant {
     public:
      NS_DECL_NSIVARIANT
      NS_DECL_NSIWRITABLEVARIANT

      nsVariantBase();

     protected:
      ~nsVariantBase() = default;

      nsDiscriminatedUnion mData;
      bool mWritable;
    };

## Minimal test - lines (29, 167)

path: .spaces[0].metrics.cyclomatic.average
old: 1.0
new: 1.1666666666666667
path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 14.0
path: .spaces[0].metrics.nom.functions
old: 1.0
new: 7.0
path: .spaces[0].metrics.nom.total
old: 1.0
new: 7.0
path: .spaces[0].metrics.halstead.volume
old: 83.76180828526729
new: 4515.230992702516
path: .spaces[0].metrics.halstead.time
old: 19.195414398707086
new: 4252.7910960678455
path: .spaces[0].metrics.halstead.n1
old: 6.0
new: 15.0
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.7958988638330426
new: 1.375722492594324
path: .spaces[0].metrics.halstead.level
old: 0.24242424242424243
new: 0.058983890954151186
path: .spaces[0].metrics.halstead.difficulty
old: 4.125
new: 16.95378151260504
path: .spaces[0].metrics.halstead.N1
old: 11.0
new: 370.0
path: .spaces[0].metrics.halstead.estimated_program_length
old: 39.50977500432694
new: 879.086672767773
path: .spaces[0].metrics.halstead.length
old: 22.0
new: 639.0
path: .spaces[0].metrics.halstead.n2
old: 8.0
new: 119.0
path: .spaces[0].metrics.halstead.bugs
old: 0.016413155228072563
new: 0.6009566085428768
path: .spaces[0].metrics.halstead.vocabulary
old: 14.0
new: 134.0
path: .spaces[0].metrics.halstead.effort
old: 345.5174591767276
new: 76550.23972922123
path: .spaces[0].metrics.halstead.N2
old: 11.0
new: 269.0
path: .spaces[0].metrics.nexits.average
old: 1.0
new: 0.14285714285714285
path: .spaces[0].metrics.loc.blank
old: 0.0
new: 15.0
path: .spaces[0].metrics.loc.lloc
old: 1.0
new: 3.0
path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 5.0
path: .spaces[0].metrics.loc.sloc
old: 3.0
new: 139.0
path: .spaces[0].metrics.loc.ploc
old: 3.0
new: 119.0
path: .spaces[0].metrics.nargs.average
old: 2.0
new: 0.2857142857142857
path: .spaces[0].metrics.mi.mi_original
old: 129.94699971644644
new: 44.082421829555344
path: .spaces[0].metrics.mi.mi_visual_studio
old: 75.99239749499792
new: 25.779194052371544
path: .spaces[0].metrics.mi.mi_sei
old: 111.8748599367085
new: 3.8027089732458546

### Code

    class nsDiscriminatedUnion {
     public:
      nsDiscriminatedUnion() : mType(nsIDataType::VTYPE_EMPTY) {
        u.mInt8Value = '\0';
      }
      nsDiscriminatedUnion(const nsDiscriminatedUnion&) = delete;
      nsDiscriminatedUnion(nsDiscriminatedUnion&&) = delete;

      ~nsDiscriminatedUnion() { Cleanup(); }

      nsDiscriminatedUnion& operator=(const nsDiscriminatedUnion&) = delete;
      nsDiscriminatedUnion& operator=(nsDiscriminatedUnion&&) = delete;

      void Cleanup();

      uint16_t GetType() const { return mType; }

      [[nodiscard]] nsresult ConvertToInt8(uint8_t* aResult) const;
      [[nodiscard]] nsresult ConvertToInt16(int16_t* aResult) const;
      [[nodiscard]] nsresult ConvertToInt32(int32_t* aResult) const;
      [[nodiscard]] nsresult ConvertToInt64(int64_t* aResult) const;
      [[nodiscard]] nsresult ConvertToUint8(uint8_t* aResult) const;
      [[nodiscard]] nsresult ConvertToUint16(uint16_t* aResult) const;
      [[nodiscard]] nsresult ConvertToUint32(uint32_t* aResult) const;
      [[nodiscard]] nsresult ConvertToUint64(uint64_t* aResult) const;
      [[nodiscard]] nsresult ConvertToFloat(float* aResult) const;
      [[nodiscard]] nsresult ConvertToDouble(double* aResult) const;
      [[nodiscard]] nsresult ConvertToBool(bool* aResult) const;
      [[nodiscard]] nsresult ConvertToChar(char* aResult) const;
      [[nodiscard]] nsresult ConvertToWChar(char16_t* aResult) const;

      [[nodiscard]] nsresult ConvertToID(nsID* aResult) const;

      [[nodiscard]] nsresult ConvertToAString(nsAString& aResult) const;
      [[nodiscard]] nsresult ConvertToAUTF8String(nsAUTF8String& aResult) const;
      [[nodiscard]] nsresult ConvertToACString(nsACString& aResult) const;
      [[nodiscard]] nsresult ConvertToString(char** aResult) const;
      [[nodiscard]] nsresult ConvertToWString(char16_t** aResult) const;
      [[nodiscard]] nsresult ConvertToStringWithSize(uint32_t* aSize,
                                                     char** aStr) const;
      [[nodiscard]] nsresult ConvertToWStringWithSize(uint32_t* aSize,
                                                      char16_t** aStr) const;

      [[nodiscard]] nsresult ConvertToISupports(nsISupports** aResult) const;
      [[nodiscard]] nsresult ConvertToInterface(nsIID** aIID,
                                                void** aInterface) const;
      [[nodiscard]] nsresult ConvertToArray(uint16_t* aType, nsIID* aIID,
                                            uint32_t* aCount, void** aPtr) const;

      [[nodiscard]] nsresult SetFromVariant(nsIVariant* aValue);

      void SetFromInt8(uint8_t aValue);
      void SetFromInt16(int16_t aValue);
      void SetFromInt32(int32_t aValue);
      void SetFromInt64(int64_t aValue);
      void SetFromUint8(uint8_t aValue);
      void SetFromUint16(uint16_t aValue);
      void SetFromUint32(uint32_t aValue);
      void SetFromUint64(uint64_t aValue);
      void SetFromFloat(float aValue);
      void SetFromDouble(double aValue);
      void SetFromBool(bool aValue);
      void SetFromChar(char aValue);
      void SetFromWChar(char16_t aValue);
      void SetFromID(const nsID& aValue);
      void SetFromAString(const nsAString& aValue);
      void SetFromAUTF8String(const nsAUTF8String& aValue);
      void SetFromACString(const nsACString& aValue);
      [[nodiscard]] nsresult SetFromString(const char* aValue);
      [[nodiscard]] nsresult SetFromWString(const char16_t* aValue);
      void SetFromISupports(nsISupports* aValue);
      void SetFromInterface(const nsIID& aIID, nsISupports* aValue);
      [[nodiscard]] nsresult SetFromArray(uint16_t aType, const nsIID* aIID,
                                          uint32_t aCount, void* aValue);
      [[nodiscard]] nsresult SetFromStringWithSize(uint32_t aSize,
                                                   const char* aValue);
      [[nodiscard]] nsresult SetFromWStringWithSize(uint32_t aSize,
                                                    const char16_t* aValue);

      // Like SetFromWStringWithSize, but leaves the string uninitialized. It does
      // does write the null-terminator.
      void AllocateWStringWithSize(uint32_t aSize);

      void SetToVoid();
      void SetToEmpty();
      void SetToEmptyArray();

      void Traverse(nsCycleCollectionTraversalCallback& aCb) const;

     private:
      [[nodiscard]] nsresult ToManageableNumber(
          nsDiscriminatedUnion* aOutData) const;
      void FreeArray();
      [[nodiscard]] bool String2ID(nsID* aPid) const;
      [[nodiscard]] nsresult ToString(nsACString& aOutString) const;

     public:
      union {
        int8_t mInt8Value;
        int16_t mInt16Value;
        int32_t mInt32Value;
        int64_t mInt64Value;
        uint8_t mUint8Value;
        uint16_t mUint16Value;
        uint32_t mUint32Value;
        uint64_t mUint64Value;
        float mFloatValue;
        double mDoubleValue;
        bool mBoolValue;
        char mCharValue;
        char16_t mWCharValue;
        nsIID mIDValue;
        nsAString* mAStringValue;
        nsAUTF8String* mUTF8StringValue;
        nsACString* mCStringValue;
        struct {
          // This is an owning reference that cannot be an nsCOMPtr because
          // nsDiscriminatedUnion needs to be POD.  AddRef/Release are manually
          // called on this.
          nsISupports* MOZ_OWNING_REF mInterfaceValue;
          nsIID mInterfaceID;
        } iface;
        struct {
          nsIID mArrayInterfaceID;
          void* mArrayValue;
          uint32_t mArrayCount;
          uint16_t mArrayType;
        } array;
        struct {
          char* mStringValue;
          uint32_t mStringLength;
        } str;
        struct {
          char16_t* mWStringValue;
          uint32_t mWStringLength;
        } wstr;
      } u;
      uint16_t mType;
    };

## Minimal test - lines (200, 209)

path: .spaces[3].metrics.mi.mi_visual_studio
old: 61.59833236701212
new: 64.60874757766398
path: .spaces[3].metrics.mi.mi_sei
old: 76.46639848908683
new: 83.99493832166654
path: .spaces[3].metrics.mi.mi_original
old: 105.33314834759072
new: 110.4809583578054
path: .spaces[3].metrics.cyclomatic.average
old: 2.0
new: 1.0
path: .spaces[3].metrics.cyclomatic.sum
old: 2.0
new: 3.0
path: .spaces[3].metrics.halstead.n2
old: 18.0
new: 4.0
path: .spaces[3].metrics.halstead.purity_ratio
old: 2.0527394393632634
new: 1.2568856570183284
path: .spaces[3].metrics.halstead.vocabulary
old: 31.0
new: 11.0
path: .spaces[3].metrics.halstead.n1
old: 13.0
new: 7.0
path: .spaces[3].metrics.halstead.volume
old: 297.2517786232125
new: 76.10749561002054
path: .spaces[3].metrics.halstead.N1
old: 32.0
new: 15.0
path: .spaces[3].metrics.halstead.length
old: 60.0
new: 22.0
path: .spaces[3].metrics.halstead.effort
old: 3005.545761634704
new: 466.15841061137576
path: .spaces[3].metrics.halstead.difficulty
old: 10.11111111111111
new: 6.125
path: .spaces[3].metrics.halstead.bugs
old: 0.06942155038225493
new: 0.020040155857929183
path: .spaces[3].metrics.halstead.estimated_program_length
old: 123.1643663617958
new: 27.651484454403228
path: .spaces[3].metrics.halstead.level
old: 0.09890109890109892
new: 0.16326530612244897
path: .spaces[3].metrics.halstead.N2
old: 28.0
new: 7.0
path: .spaces[3].metrics.halstead.time
old: 166.97476453526133
new: 25.897689478409763
path: .spaces[3].metrics.nom.functions
old: 1.0
new: 2.0
path: .spaces[3].metrics.nom.total
old: 1.0
new: 2.0
path: .spaces[3].metrics.loc.blank
old: 1.0
new: 2.0
path: .spaces[3].metrics.loc.sloc
old: 9.0
new: 10.0
path: .spaces[3].metrics.loc.lloc
old: 3.0
new: 0.0
path: .spaces[3].metrics.nexits.sum
old: 1.0
new: 0.0
path: .spaces[3].metrics.nexits.average
old: 1.0
new: 0.0
path: .spaces[3].metrics.cognitive.average
old: 1.0
new: 0.0
path: .spaces[3].metrics.cognitive.sum
old: 1.0
new: 0.0
path: .spaces[3].metrics.nargs.sum
old: 4.0
new: 0.0
path: .spaces[3].metrics.nargs.average
old: 4.0
new: 0.0

### Code

    class nsVariantCC final : public nsVariantBase {
     public:
      NS_DECL_CYCLE_COLLECTING_ISUPPORTS
      NS_DECL_CYCLE_COLLECTION_CLASS(nsVariantCC)

      nsVariantCC() = default;

     private:
      ~nsVariantCC() = default;
    };