)]}'
{
  "commit": "b4f31fab7cc43026a264b32348eecb6f94a7b0b5",
  "tree": "329fef36777519534b059da8b932d4ebbb4e3377",
  "parents": [
    "4ca2f7a6a1ebd89ad40fd1016c8c42ebe1974e29"
  ],
  "author": {
    "name": "Henner Zeller",
    "email": "h.zeller@acm.org",
    "time": "Thu Nov 21 01:36:24 2019 -0800"
  },
  "committer": {
    "name": "Henner Zeller",
    "email": "h.zeller@acm.org",
    "time": "Thu Nov 21 01:54:12 2019 -0800"
  },
  "message": "Code-clean: Modernize class Value and its implementations.\n\nMostly to improve code robustness and follow style-guides.\n\nGeneral cleanup:\n\n  * Add a virtual destructor in the base class (otherwise strange things\n    might happen)\n  * Use \u0027final\u0027 overridden virtuals. This allows compiler errors if\n    signature changes in base-class thus robust ways to refactor. Also,\n    \u0027final\u0027 allows the compiler to optimize away a virtual method look-up\n    if it can infer the exact type at compile-time.\n  * Use constructor initializer lists instead of assigning in constructor\n    body.\n  * Type enum: use enum class for more type-safe and enforced scoped use.\n    (this required some small changes outside the Value.{h,cpp} files).\n  * Use nullptr instead of NULL.\n\nConst cleanness:\n\n  * Getter methods that don\u0027t change anything: make const. This way they can be\n    used in a const context.\n  * operators \u003c and \u003d\u003d: make const member operators and also have their parameters\n    be const (otherwise all kinds of algorithms will stumble upon this)\n  * Make setter take a const std::string\u0026 instead of std::string by value.\n  * Copy constructors: take const reference parameter\n  * Make parameters whose values are guaranteed to not be modifed const\n    e.g. plus()/minus()/.. etc)\n\nBehavior change:\n\n  * Use strtod() instead of atof() to parse double value (avoid\n    loss of precision)\n\nSigned-off-by: Henner Zeller \u003ch.zeller@acm.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "326ddb8bd5803467998b68bc242c0d333465fe20",
      "old_mode": 33188,
      "old_path": "src/Design/DataType.cpp",
      "new_id": "74adfd4fe80f21dfb426119d4189ec48ae82875f",
      "new_mode": 33188,
      "new_path": "src/Design/DataType.cpp"
    },
    {
      "type": "modify",
      "old_id": "20d1b51de906a9ec07aab479115ae83e6e7d422b",
      "old_mode": 33188,
      "old_path": "src/DesignCompile/CompileHelper.cpp",
      "new_id": "cf2b94ece815c5a2371cc906fc2cbfe3b367704c",
      "new_mode": 33188,
      "new_path": "src/DesignCompile/CompileHelper.cpp"
    },
    {
      "type": "modify",
      "old_id": "ac088b5096e69b6f74e6e4115a069d52f4e49ea0",
      "old_mode": 33188,
      "old_path": "src/DesignCompile/TestbenchElaboration.cpp",
      "new_id": "4df445fe9ee19796431b84a4a634f0dfe876fbde",
      "new_mode": 33188,
      "new_path": "src/DesignCompile/TestbenchElaboration.cpp"
    },
    {
      "type": "modify",
      "old_id": "c230846d3ee253133f7aa8518474a9b142ad340e",
      "old_mode": 33188,
      "old_path": "src/Expression/ExprBuilder.cpp",
      "new_id": "6e68a21fe1517165f0acd5ac877cd56831ad0367",
      "new_mode": 33188,
      "new_path": "src/Expression/ExprBuilder.cpp"
    },
    {
      "type": "modify",
      "old_id": "ba7e9578539ac0c2e011a3703d3a19a5a614ea47",
      "old_mode": 33188,
      "old_path": "src/Expression/Value.cpp",
      "new_id": "b7bbb29a1c0bd979cf0713ca5626adaf2e271254",
      "new_mode": 33188,
      "new_path": "src/Expression/Value.cpp"
    },
    {
      "type": "modify",
      "old_id": "4468713e162b74e1ca5c515c7ff10ac7e5f4690e",
      "old_mode": 33188,
      "old_path": "src/Expression/Value.h",
      "new_id": "34dfb333058428f8effecac5cf0061297f734182",
      "new_mode": 33188,
      "new_path": "src/Expression/Value.h"
    }
  ]
}
