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;
}