]> code.delx.au - gnu-emacs/blob - test/manual/etags/cp-src/clheir.hpp
Merge from origin/emacs-25
[gnu-emacs] / test / manual / etags / cp-src / clheir.hpp
1 /* ======================================================================= */
2 /* CLHEIR.H */
3 /* ======================================================================= */
4
5 // CLASS HEIRARCHY
6 // Locations or Agents are both of type generic_object. Generic_objects may
7 // have states, and are responsible for updating their states appropriately
8 // when their step() functions are executed.
9
10 extern void init_registry(void);
11 extern void step_everybody(void);
12
13 class generic_object
14 {
15 int where_in_registry;
16 public:
17 generic_object(); // enter generic_object into ObjectRegistry
18 // We never copy generic_objects, so we don't need a copy constructor.
19 ~generic_object(void); // delete from ObjectRegistry
20 // Simulation steps, accommodate different kinds of time
21 virtual void compute_next_state(void) { }
22 virtual void step(void) { }
23 };
24
25 // =======================================================================
26
27 // Locations can be regular (like a field of squares or hexagons) or
28 // irregular. Regular locations have 2-D or 3-D positions represented
29 // by integers. Locations are never copied; no need for copy constructors.
30
31 const int max_num_directions = 6; // handles both cubes and hexagons
32
33 class location: public generic_object
34 {
35 // Any kind of location needs a physical position, but for a regular
36 // location, this may be implicit, and for an irregular location, it
37 // should be custom-defined.
38
39 // Any kind of location needs a private list of neighbors, but for a
40 // regular location, this may be implicit.
41
42 public:
43 location() { }
44 ~location();
45 };
46
47 class irregular_location: public location
48 {
49 double x, y, z;
50 public:
51 irregular_location(double xi, double yi, double zi)
52 { x = xi; y = yi; z = zi; }
53 ~irregular_location();
54 };
55
56 class discrete_location: public location
57 {
58 int x, y, z;
59 class location *neighbors[max_num_directions];
60 void clear_neighbors(void);
61 public:
62 discrete_location(int xi, int yi, int zi):
63 x(xi), y(yi), z(zi)
64 { clear_neighbors(); }
65 ~discrete_location(void);
66 void assign_neighbor(int direction, location *x)
67 { neighbors[direction] = x; }
68 };
69
70 // =======================================================================
71
72 // Agents are generic_objects with locations, who can move. Examples in
73 // Pacman would be the protagonist, the monsters, and the monsters' ghosts.
74
75 class agent: public generic_object
76 {
77 location *where;
78 public:
79 agent();
80 ~agent();
81 void move(int);
82 };