)]}'
{
  "commit": "58ede2772e9b14c667d51c3c21a5402eb64de2ac",
  "tree": "4d52ab1871c32421496d76353358ae59ce55c2fa",
  "parents": [
    "57a3458e56aaf249939006390f08d8fef7e7990f"
  ],
  "author": {
    "name": "Keir Mierle",
    "email": "mierle@gmail.com",
    "time": "Sun Jun 24 17:23:57 2012 -0700"
  },
  "committer": {
    "name": "Keir Mierle",
    "email": "mierle@gmail.com",
    "time": "Sun Jun 24 17:42:53 2012 -0700"
  },
  "message": "Add a portable floating point classification API\n\nCeres has traditionally battled with portability issues\nwhen trying to classify floating point values as one\ntype or another. For example, in C99 \u0027isnan\u0027 is a\nmacro. Since it is a macro, it is impossible to\noverride the name in other namespaces.\n\nInstead of trying to use preprocessor hacks to work\naround the issue, define our own set of camel-case\nnames for use internally and by Ceres clients. For\nexample do this:\n\n  template\u003ctypename T\u003e\n  void MyFunction(T x, T y) {\n    if (ceres::IsNaN(x)) {\n      ...\n    }\n  }\n\ninstead of using \"isnan\" or \"std::isnan\". Note that\nwhile GCC and Apple GCC both import \u0027isnan\u0027 into\nthe std namespace, it is not standard until C++11\nwhich Ceres will not require for some years.\n\nChange-Id: Ibcc96a8bb4ba63aa67cbbc58658b2e5671cd5824\n",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "59424bf3ec679850061795238aae6883ec1bb348",
      "new_mode": 33188,
      "new_path": "include/ceres/fpclassify.h"
    },
    {
      "type": "modify",
      "old_id": "50b5555c5a78ee61b6ef7e8ca38a86261a94e3f6",
      "old_mode": 33188,
      "old_path": "include/ceres/jet.h",
      "new_id": "f9997bdf2b5722a5483f06a016ee33252efdafc6",
      "new_mode": 33188,
      "new_path": "include/ceres/jet.h"
    },
    {
      "type": "modify",
      "old_id": "aab0c21edf1158fb279db56acf8861d7beacaa8a",
      "old_mode": 33188,
      "old_path": "internal/ceres/array_utils.cc",
      "new_id": "673baa4f70f86dd1f1a36bf65d4e2bc80370e85c",
      "new_mode": 33188,
      "new_path": "internal/ceres/array_utils.cc"
    },
    {
      "type": "modify",
      "old_id": "09a02796f1fc651bdd4d86b0f16cd506ed80b9e7",
      "old_mode": 33188,
      "old_path": "internal/ceres/conjugate_gradients_solver.cc",
      "new_id": "7501bb2dbd3d83c32e2ca9ccb5420ad58fcde3ba",
      "new_mode": 33188,
      "new_path": "internal/ceres/conjugate_gradients_solver.cc"
    },
    {
      "type": "modify",
      "old_id": "2e47b63eb661ed174b4bfb137d9704e275948dea",
      "old_mode": 33188,
      "old_path": "internal/ceres/jet_test.cc",
      "new_id": "f12b8b988e3ce8c3c8501b85a54b1dae4c1de353",
      "new_mode": 33188,
      "new_path": "internal/ceres/jet_test.cc"
    },
    {
      "type": "modify",
      "old_id": "8315e8e2f844bb65a6c586eb601f870754c58638",
      "old_mode": 33188,
      "old_path": "internal/ceres/local_parameterization_test.cc",
      "new_id": "aa49250d903d7ed9cb1b170dbeab2a4a7e4d94be",
      "new_mode": 33188,
      "new_path": "internal/ceres/local_parameterization_test.cc"
    },
    {
      "type": "modify",
      "old_id": "a8351d50be5097949d8d693bc9038f89e7d07280",
      "old_mode": 33188,
      "old_path": "internal/ceres/rotation_test.cc",
      "new_id": "55a4fbb999507bfa47718b4ada074ce2d215debd",
      "new_mode": 33188,
      "new_path": "internal/ceres/rotation_test.cc"
    }
  ]
}
