From f5f6dac8009fb481118be94ce18e043a057bd036 Mon Sep 17 00:00:00 2001
From: Niels Lohmann <mail@nlohmann.me>
Date: Sat, 11 Mar 2017 15:32:44 +0100
Subject: [PATCH] :sparkles: added overload for std::vector<bool> #494

Adds a to_json function for std::vector<bool> to allow implicit
conversion from bit vectors to basic_json.
---
 src/json.hpp                 | 19 +++++++++++++++++++
 src/json.hpp.re2c            | 19 +++++++++++++++++++
 test/src/unit-regression.cpp |  9 +++++++++
 3 files changed, 47 insertions(+)

diff --git a/src/json.hpp b/src/json.hpp
index ff0ce5ad..432cf553 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -324,6 +324,19 @@ struct external_constructor<value_t::array>
         j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
         j.assert_invariant();
     }
+
+    template<typename BasicJsonType>
+    static void construct(BasicJsonType& j, const std::vector<bool>& arr)
+    {
+        j.m_type = value_t::array;
+        j.m_value = value_t::array;
+        j.m_value.array->reserve(arr.size());
+        for (bool x : arr)
+        {
+            j.m_value.array->push_back(x);
+        }
+        j.assert_invariant();
+    }
 };
 
 template<>
@@ -562,6 +575,12 @@ void to_json(BasicJsonType& j, UnscopedEnumType e) noexcept
     external_constructor<value_t::number_integer>::construct(j, e);
 }
 
+template<typename BasicJsonType>
+void to_json(BasicJsonType& j, std::vector<bool> e) noexcept
+{
+    external_constructor<value_t::array>::construct(j, e);
+}
+
 template <
     typename BasicJsonType, typename CompatibleArrayType,
     enable_if_t <
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index fc7cf965..21b4fd3a 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -324,6 +324,19 @@ struct external_constructor<value_t::array>
         j.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
         j.assert_invariant();
     }
+
+    template<typename BasicJsonType>
+    static void construct(BasicJsonType& j, const std::vector<bool>& arr)
+    {
+        j.m_type = value_t::array;
+        j.m_value = value_t::array;
+        j.m_value.array->reserve(arr.size());
+        for (bool x : arr)
+        {
+            j.m_value.array->push_back(x);
+        }
+        j.assert_invariant();
+    }
 };
 
 template<>
@@ -562,6 +575,12 @@ void to_json(BasicJsonType& j, UnscopedEnumType e) noexcept
     external_constructor<value_t::number_integer>::construct(j, e);
 }
 
+template<typename BasicJsonType>
+void to_json(BasicJsonType& j, std::vector<bool> e) noexcept
+{
+    external_constructor<value_t::array>::construct(j, e);
+}
+
 template <
     typename BasicJsonType, typename CompatibleArrayType,
     enable_if_t <
diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp
index 7980371b..bfd2c954 100644
--- a/test/src/unit-regression.cpp
+++ b/test/src/unit-regression.cpp
@@ -795,4 +795,13 @@ TEST_CASE("regression tests")
         std::string s2 = j2.dump();
         CHECK(s1 == s2);
     }
+
+    SECTION("issue #494 - conversion from vector<bool> to json fails to build")
+    {
+        std::vector<bool> boolVector = {false, true, false, false};
+        json j;
+        j["bool_vector"] = boolVector;
+
+        CHECK(j["bool_vector"].dump() == "[false,true,false,false]");
+    }
 }