From 9680c3081018ac9346c9bb4f671f913e3ae2e562 Mon Sep 17 00:00:00 2001
From: Wolfgang Bangerth <bangerth@colostate.edu>
Date: Thu, 28 Mar 2019 09:00:42 -0600
Subject: [PATCH] Allow initialization of Vector with std::initializer_list.

---
 include/deal.II/lac/vector.h | 35 ++++++++++++++++++++++++++++++++---
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/include/deal.II/lac/vector.h b/include/deal.II/lac/vector.h
index 5ba9658531..7372650b49 100644
--- a/include/deal.II/lac/vector.h
+++ b/include/deal.II/lac/vector.h
@@ -34,6 +34,7 @@
 
 #include <cstdio>
 #include <cstring>
+#include <initializer_list>
 #include <iostream>
 #include <vector>
 
@@ -164,14 +165,34 @@ public:
   Vector(Vector<Number> &&v) noexcept = default;
 
   /**
-   * Copy constructor taking a vector of another data type. This will fail if
-   * there is no conversion path from @p OtherNumber to @p Number. Note that
-   * you may lose accuracy when copying to a vector with data elements with
+   * Copy constructor taking a vector of another data type.
+   *
+   * This constructor will fail to compile if
+   * there is no conversion path from @p OtherNumber to @p Number. You may
+   * lose accuracy when copying to a vector with data elements with
    * less accuracy.
    */
   template <typename OtherNumber>
   explicit Vector(const Vector<OtherNumber> &v);
 
+  /**
+   * Copy constructor taking an object of type `std::initializer_list`. This
+   * constructor can be used to initialize a vector using a brace-enclosed
+   * list of numbers, such as in the following example:
+   * @code
+   *   Vector<double> v({1,2,3});
+   * @endcode
+   * This creates a vector of size 3, whose (double precision) elements have
+   * values 1.0, 2.0, and 3.0.
+   *
+   * This constructor will fail to compile if
+   * there is no conversion path from @p OtherNumber to @p Number. You may
+   * lose accuracy when copying to a vector with data elements with
+   * less accuracy.
+   */
+  template <typename OtherNumber>
+  explicit Vector(const std::initializer_list<OtherNumber> &v);
+
 #ifdef DEAL_II_WITH_PETSC
   /**
    * Another copy constructor: copy the values from a PETSc vector class. This
@@ -1049,6 +1070,14 @@ inline Vector<Number>::Vector()
 
 
 
+template <typename Number>
+template <typename OtherNumber>
+Vector<Number>::Vector(const std::initializer_list<OtherNumber> &v)
+  : Vector(v.begin(), v.end())
+{}
+
+
+
 template <typename Number>
 template <typename InputIterator>
 Vector<Number>::Vector(const InputIterator first, const InputIterator last)
-- 
2.39.5