@@ -101,8 +101,8 @@ using arg_t = variant::variant<c_array_t<double>,
101101                               int ,
102102                               c_array_t <std::string>,
103103                               std::string>;
104- 
105- using  weight_t  = variant::variant<variant::monostate, double , c_array_t <double >>;
104+ template  < class   T > 
105+ using  weight_t  = variant::variant<variant::monostate, T , c_array_t <T >>;
106106
107107inline  auto  get_vargs (const  vector_axis_variant& axes, const  py::args& args) {
108108    if (args.size () != axes.size ())
@@ -131,25 +131,26 @@ inline auto get_vargs(const vector_axis_variant& axes, const py::args& args) {
131131    return  vargs;
132132}
133133
134- inline  auto  get_weight (py::kwargs& kwargs) {
134+ template  <class  T >
135+ auto  get_weight (py::kwargs& kwargs) {
135136    //  default constructed as monostate to indicate absence of weight
136-     variant::variant<variant::monostate,  double ,  c_array_t < double > > weight;
137+     weight_t <T > weight;
137138    auto  w = optional_arg (kwargs, " weight" 
138139    if (!w.is_none ()) {
139-         if (is_value<double >(w))
140-             weight = py::cast<double >(w);
140+         if (is_value<T >(w))
141+             weight = py::cast<T >(w);
141142        else 
142-             weight = py::cast<c_array_t <double >>(w);
143+             weight = py::cast<c_array_t <T >>(w);
143144    }
144145    return  weight;
145146}
146147
147148//  for accumulators that accept a weight
148- template  <class  Histogram , class  VArgs >
149+ template  <class  weight_type ,  class   Histogram , class  VArgs >
149150void  fill_impl (bh::detail::accumulator_traits_holder<true >,
150151               Histogram& h,
151152               const  VArgs& vargs,
152-                const  weight_t & weight,
153+                const  weight_t <weight_type> & weight,
153154               py::kwargs& kwargs) {
154155    finalize_args (kwargs);
155156
@@ -162,11 +163,11 @@ void fill_impl(bh::detail::accumulator_traits_holder<true>,
162163}
163164
164165//  for accumulators that accept a weight and a double
165- template  <class  Histogram , class  VArgs >
166+ template  <class  weight_type ,  class   Histogram , class  VArgs >
166167void  fill_impl (bh::detail::accumulator_traits_holder<true , const  double &>,
167168               Histogram& h,
168169               const  VArgs& vargs,
169-                const  weight_t & weight,
170+                const  weight_t <weight_type> & weight,
170171               py::kwargs& kwargs) {
171172    auto  s = required_arg (kwargs, " sample" 
172173    finalize_args (kwargs);
@@ -191,10 +192,14 @@ void fill_impl(bh::detail::accumulator_traits_holder<true, const double&>,
191192template  <class  Histogram >
192193Histogram& fill (Histogram& self, py::args args, py::kwargs kwargs) {
193194    using  value_type = typename  Histogram::value_type;
194-     detail::fill_impl (bh::detail::accumulator_traits<value_type>{},
195-                       self,
196-                       detail::get_vargs (bh::unsafe_access::axes (self), args),
197-                       detail::get_weight (kwargs),
198-                       kwargs);
195+     using  weight_type
196+         = boost::mp11::mp_if_c<std::is_integral<value_type>::value, int , double >;
197+ 
198+     detail::fill_impl<weight_type>(
199+         bh::detail::accumulator_traits<value_type>{},
200+         self,
201+         detail::get_vargs (bh::unsafe_access::axes (self), args),
202+         detail::get_weight<weight_type>(kwargs),
203+         kwargs);
199204    return  self;
200205}
0 commit comments