GithubHelp home page GithubHelp logo

Comments (2)

mavam avatar mavam commented on August 24, 2024

Here's an untested/uncompiled strawman to be included in the any_iterator benchmarks:

namespace { namespace variant {
  template <typename Derived>
  struct concept_t {
    friend bool operator==(Derived const& a, Derived const& b) {
      return a.equal(b);
    }

    Derived& operator++() {
      static_cast<Derived*>(this)->increment();
      return *this;
    }

    decltype(auto) operator*() {
      return static_cast<Derived*>(this)->dereference();
    }
  };

  template <typename Iterator>
  struct model_t : concept_t<Iterator> {
    model_t(Iterator it) : it_{it} { }
    bool equal(model_t const& other) { return it_ == other.it_; }
    void increment() { ++it_; }
    typename Iterator::reference dereference() { return *it_; }
  private:
    Iterator it_;
  }

  template <typename... Ts>
  struct variant {
    // TODO: implement
  };

  template <typename F f, typename T>
  decltype(auto) visit(F&&, T&& x) {
    // TODO: apply f(x)
  }

  template <typename... Ts>
  using iterator_variant = variant<model_t<Ts>...>;

  template <typename Value, typename Reference = Value&>
  struct any_iterator : concept_t<any_iterator<Value, Reference>> {
    using value_type = Value;
    using reference = Reference;

    template <typename Iterator>
    explicit any_iterator(Iterator it)
      : v_{model_t<Iterator>{it}}
    { }

    bool equal(any_iterator const& other) {
      return v_ == other.v_; // relies on variant<Ts>::operator==
    }

    void increment() {
      visit([](auto& x) { ++x; }, v_);
    }

    Reference dereference() {
      return visit([](auto& x) { *x; }, v_);
    }

  private:
    iterator_variant<Value> v_;
  };
}} // end namespace variant

I hope that goes in the right direction. It's a bit quirky because unlike the other approaches to type-erasure, the variant is bounded a priori. So the corresponding any_iterator is a bit clunky: right now it only holds one value.

from dyno.

ldionne avatar ldionne commented on August 24, 2024

Closed by #18.

from dyno.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.