Some code is worth a thousand words... :-) See attachment for an abstract
version of a suggestion.

-- 
-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.
#include <iostream>

struct IdGen {
    IdGen(int start = 42) : id_(start) {}
    int ReserveIdRange(int n) {
      std::cout << "reserved range [" << id_ << ".." << (id_ + n - 1) << "]" << std::endl;
      int tmp = id_;
      id_ += n;
      return tmp;
    }
    int id_;
};

class A {
 public:
  // for renumbering
  void set_base_id(int s) { base_id_ = s; }
  static int num_ids() { return parent_num_ids() + 2; }
  // the various IDs for this kind of node
  int a1() const { return local_id(0); }
  int a2() const { return local_id(1); }
 protected:
  static int parent_num_ids() { return 0; }
  int base_id() const { return base_id_; }
 private:
  // convenience function
  int local_id(int n) const { return base_id() + parent_num_ids() + n; }
  int base_id_;
};

class BA: public A {
 public:
  static int num_ids() { return parent_num_ids() + 3; }
  int b1() const { return local_id(0); }
  int b2() const { return local_id(1); }
  int b3() const { return local_id(2); }
 protected:
  static int parent_num_ids() { return A::num_ids(); }
 private:
  int local_id(int n) const { return base_id() + parent_num_ids() + n; }
};

class CBA: public BA {
 public:
  static int num_ids() { return parent_num_ids() + 5; }
  int c1() const { return local_id(0); }
  int c2() const { return local_id(1); }
  int c3() const { return local_id(2); }
  int c4() const { return local_id(3); }
  int c5() const { return local_id(4); }
 protected:
  static int parent_num_ids() { return BA::num_ids(); }
 private:
  int local_id(int n) const { return base_id() + parent_num_ids() + n; }
};

class DCBA: public CBA {
 public:
  static int num_ids() { return parent_num_ids() + 2; }
  int d1() const { return local_id(0); }
  int d2() const { return local_id(1); }
 protected:
  static int parent_num_ids() { return CBA::num_ids(); }
 private:
  int local_id(int n) const { return base_id() + parent_num_ids() + n; }
};

class EA: public A {
 public:
  static int num_ids() { return parent_num_ids() + 7; }
  int e1() const { return local_id(0); }
  int e2() const { return local_id(1); }
  int e3() const { return local_id(2); }
  int e4() const { return local_id(3); }
  int e5() const { return local_id(4); }
  int e6() const { return local_id(5); }
  int e7() const { return local_id(6); }
 protected:
  static int parent_num_ids() { return A::num_ids(); }
 private:
  int local_id(int n) const { return base_id() + parent_num_ids() + n; }
};

// Look at the generated assembly code to see that it's simply a load + and addition with a constant.
int hurz(DCBA* x) { return x->d2(); }

int main() {
  // "Parsing"
  DCBA dcba;
  EA ea;

  // "Numbering pass"
  IdGen gen;
  dcba.set_base_id(gen.ReserveIdRange(DCBA::num_ids()));
  ea.set_base_id(gen.ReserveIdRange(EA::num_ids()));

  std::cout << "----------------------------------------" << std::endl;
  std::cout << "a1: " << dcba.a1() << std::endl;
  std::cout << "a2: " << dcba.a2() << std::endl;
  std::cout << "b1: " << dcba.b1() << std::endl;
  std::cout << "b2: " << dcba.b2() << std::endl;
  std::cout << "b3: " << dcba.b3() << std::endl;
  std::cout << "c1: " << dcba.c1() << std::endl;
  std::cout << "c2: " << dcba.c2() << std::endl;
  std::cout << "c3: " << dcba.c3() << std::endl;
  std::cout << "c4: " << dcba.c4() << std::endl;
  std::cout << "c5: " << dcba.c5() << std::endl;
  std::cout << "d1: " << dcba.d1() << std::endl;
  std::cout << "d2: " << dcba.d2() << std::endl;

  std::cout << "----------------------------------------" << std::endl;
  std::cout << "a1: " << ea.a1() << std::endl;
  std::cout << "a2: " << ea.a2() << std::endl;
  std::cout << "e1: " << ea.e1() << std::endl;
  std::cout << "e2: " << ea.e2() << std::endl;
  std::cout << "e3: " << ea.e3() << std::endl;
  std::cout << "e4: " << ea.e4() << std::endl;
  std::cout << "e5: " << ea.e5() << std::endl;
  std::cout << "e6: " << ea.e6() << std::endl;
  std::cout << "e7: " << ea.e6() << std::endl;

  return 0;
}

Reply via email to