{"action":"closed","issue":{"url":"https://api.github.com/repos/CaseyCarter/cmcstl2/issues/15","labels_url":"https://api.github.com/repos/CaseyCarter/cmcstl2/issues/15/labels{/name}","comments_url":"https://api.github.com/repos/CaseyCarter/cmcstl2/issues/15/comments","events_url":"https://api.github.com/repos/CaseyCarter/cmcstl2/issues/15/events","html_url":"https://github.com/CaseyCarter/cmcstl2/issues/15","id":106657259,"number":15,"title":"Future work: WeakRange","user":{"login":"CaseyCarter","id":456873,"avatar_url":"https://avatars.githubusercontent.com/u/456873?v=3","gravatar_id":"","url":"https://api.github.com/users/CaseyCarter","html_url":"https://github.com/CaseyCarter","followers_url":"https://api.github.com/users/CaseyCarter/followers","following_url":"https://api.github.com/users/CaseyCarter/following{/other_user}","gists_url":"https://api.github.com/users/CaseyCarter/gists{/gist_id}","starred_url":"https://api.github.com/users/CaseyCarter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CaseyCarter/subscriptions","organizations_url":"https://api.github.com/users/CaseyCarter/orgs","repos_url":"https://api.github.com/users/CaseyCarter/repos","events_url":"https://api.github.com/users/CaseyCarter/events{/privacy}","received_events_url":"https://api.github.com/users/CaseyCarter/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/CaseyCarter/cmcstl2/labels/enhancement","name":"enhancement","color":"84b6eb"}],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":5,"created_at":"2015-09-15T22:04:11Z","updated_at":"2015-12-10T19:34:11Z","closed_at":"2015-12-10T19:34:11Z","body":"```c++\r\ntemplate <class S, class I>\r\nconcept WeakSentinel =\r\n  WeakIterator<I>() && Semiregular<S>() &&\r\n  requires (const I& i, const S& s) {\r\n    { i == s } -> Boolean;\r\n    { i != s } -> Boolean;\r\n    // Axiom: bool(i != s) == !bool(i == s)\r\n  };\r\n\r\ntemplate <class R>\r\n  requires WeakIterator<decltype(begin(declval<remove_reference_t<R>&>()))>()\r\nusing IteratorType = decltype(begin(declval<remove_reference_t<R>&>()));\r\n\r\ntemplate <class R>\r\n  requires WeakSentinel<decltype(end(declval<remove_reference_t<R>&>())), IteratorType<R>>\r\nusing SentinelType = decltype(end(declval<remove_reference_t<R>&>()));\r\n\r\ntemplate <class R>\r\nconcept bool WeakRange =\r\n  requires { typename SentinelType<R>; };\r\n\r\ntemplate <class R>\r\nconcept bool WeakInputRange =\r\n  WeakRange<R> && WeakInputIterator<IteratorType<R>>();\r\n\r\ntemplate <class R, class T>\r\nconcept bool WeakOutputRange =\r\n  WeakRange<R> && WeakOutputIterator<IteratorType<R>, T>();\r\n\r\ntemplate <class R>\r\nconcept bool Range =\r\n  WeakRange<R> && Sentinel<SentinelType<R>, IteratorType<R>>();\r\n```\r\nI postulate that there is no model of `InputIterator` / `OutputIterator` that is not equivalent to some model of `WeakInputIterator` / `WeakOutputIterator`, i.e, `InputIterator` and `OutputIterator` are extraneous and do not increase the expressiveness of the design. If we relax every `Input`/`Output` `Range`/`Iterator` requirement to `Weak` `Input`/`Output` `Range`/`Iteratator` the `Input`/`Output` `Iterator` concepts could be deprecated."}}