int main()
{
    int ia[] = {0, 1, 2, 2, 0, 1, 2, 3};
    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    int ib[] = {0, 1, 2, 3, 0, 1, 2, 3};
    assert(std::mismatch(make_input_range(std::iter_range<const int*>(ia, ia + sa)),
                         make_input_range(std::single_iter_range<const int*>(ib)),
                         std::equal_to<int>()) ==
                         (std::pair<input_range<std::iter_range<const int*> >,
	    input_range<std::single_iter_range<const int*> > >
	    (make_input_range(std::iter_range<const int*>(ia+3, ia+sa)),
	     make_input_range(std::single_iter_range<const int*>(ib+3)))));
}
int main()
{
    int ia[] = {0, 1, 2, 3, 4, 5};
    const unsigned s = sizeof(ia)/sizeof(ia[0]);
    int ib[s] = {0, 1, 2, 5, 4, 5};
    assert(std::equal(make_input_range(std::make_iter_range(
                          input_iterator<const int*>(ia),
                          input_iterator<const int*>(ia+s))),
                      make_input_range(std::make_single_iter_range(
			  input_iterator<const int*>(ia)))));
    assert(!std::equal(make_input_range(std::make_iter_range(
                           input_iterator<const int*>(ia),
                           input_iterator<const int*>(ia+s))),
                       make_input_range(std::make_single_iter_range(
			   input_iterator<const int*>(ib)))));
}
 infer_handle_from_class_t<T>
 spawn_class_in_groups(actor_config& cfg, Iter first, Iter last, Ts&&... xs) {
   check_invariants<T>();
   auto irange = make_input_range(first, last);
   cfg.groups = &irange;
   return spawn_class<T, Os>(cfg, std::forward<Ts>(xs)...);
 }
 infer_handle_from_fun_t<F>
 spawn_fun_in_groups(actor_config& cfg, Iter first, Iter second,
                     F& fun, Ts&&... xs) {
   check_invariants<infer_impl_from_fun_t<F>>();
   auto irange = make_input_range(first, second);
   cfg.groups = &irange;
   return spawn_functor<Os>(cfg, fun, std::forward<Ts>(xs)...);
 }
int main()
{
    int ia[] = {0, 1, 2, 3, 0, 1, 2, 3};
    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    int ib[] = {1, 3, 5, 7};
    const unsigned sb = sizeof(ib)/sizeof(ib[0]);
    assert(std::find_first_of(make_input_range(std::make_iter_range(ia, ia + sa)),
                              make_forward_range(std::make_iter_range(ib, ib + sb)),
                              std::equal_to<int>()) ==
	   make_input_range(std::make_iter_range(ia+1, ia + sa)));
    int ic[] = {7};
    assert(std::find_first_of(make_input_range(std::make_iter_range(ia, ia + sa)),
                              make_forward_range(std::make_iter_range(ic,ic + 1)),
                              std::equal_to<int>()) ==
	   make_input_range(std::make_iter_range(ia+sa, ia+sa)));
    assert(std::find_first_of(make_input_range(std::make_iter_range(ia, ia + sa)),
                              make_forward_range(std::make_iter_range(ic, ic)),
                              std::equal_to<int>()) ==
	   make_input_range(std::make_iter_range(ia+sa, ia+sa)));
    assert(std::find_first_of(make_input_range(std::make_iter_range(ia,ia)),
                              make_forward_range(std::make_iter_range(ic, ic+1)),
                              std::equal_to<int>()) ==
	   make_input_range(std::make_iter_range(ia, ia)));
}