~ubuntu-branches/ubuntu/wily/gargoyle-free/wily-proposed

« back to all changes in this revision

Viewing changes to tads/tads3/vmcoll.h

  • Committer: Bazaar Package Importer
  • Author(s): Sylvain Beucler
  • Date: 2009-09-11 20:09:43 UTC
  • Revision ID: james.westby@ubuntu.com-20090911200943-idgzoyupq6650zpn
Tags: upstream-2009-08-25
ImportĀ upstreamĀ versionĀ 2009-08-25

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Header$ */
 
2
 
 
3
/* 
 
4
 *   Copyright (c) 2000, 2002 Michael J. Roberts.  All Rights Reserved.
 
5
 *   
 
6
 *   Please see the accompanying license file, LICENSE.TXT, for information
 
7
 *   on using and copying this software.  
 
8
 */
 
9
/*
 
10
Name
 
11
  vmcoll.h - T3 Collection base class
 
12
Function
 
13
  A Collection is the base class for List, Array, and other objects
 
14
  providing a collection of objects that can be iterated via an
 
15
  Iterator.
 
16
 
 
17
  Collection is an abstract base class: it cannot be instantiated, and
 
18
  thus has no image-file or state-file representation.
 
19
Notes
 
20
  
 
21
Modified
 
22
  04/22/00 MJRoberts  - Creation
 
23
*/
 
24
 
 
25
#ifndef VMCOLL_H
 
26
#define VMCOLL_H
 
27
 
 
28
#include <stdlib.h>
 
29
#include "vmtype.h"
 
30
#include "vmobj.h"
 
31
#include "vmglob.h"
 
32
#include "vmerr.h"
 
33
#include "vmerrnum.h"
 
34
 
 
35
 
 
36
class CVmObjCollection: public CVmObject
 
37
{
 
38
    friend class CVmMetaclassCollection;
 
39
    
 
40
public:
 
41
    /* metaclass registration object */
 
42
    static class CVmMetaclass *metaclass_reg_;
 
43
    class CVmMetaclass *get_metaclass_reg() const { return metaclass_reg_; }
 
44
 
 
45
    /* am I of the given metaclass? */
 
46
    virtual int is_of_metaclass(class CVmMetaclass *meta) const
 
47
    {
 
48
        /* try my own metaclass and my base class */
 
49
        return (meta == metaclass_reg_
 
50
                || CVmObject::is_of_metaclass(meta));
 
51
    }
 
52
 
 
53
    /* 
 
54
     *   call a static property - we don't have any of our own, so simply
 
55
     *   "inherit" the base class handling 
 
56
     */
 
57
    static int call_stat_prop(VMG_ vm_val_t *result,
 
58
                              const uchar **pc_ptr, uint *argc,
 
59
                              vm_prop_id_t prop)
 
60
        { return CVmObject::call_stat_prop(vmg_ result, pc_ptr, argc, prop); }
 
61
 
 
62
    /* get a property */
 
63
    int get_prop(VMG_ vm_prop_id_t prop, vm_val_t *retval,
 
64
                 vm_obj_id_t self, vm_obj_id_t *source_obj, uint *argc);
 
65
 
 
66
    /* 
 
67
     *   constant value property evaluator - this allows us to evaluate a
 
68
     *   property for an object value or for a constant value using the
 
69
     *   same code 
 
70
     */
 
71
    int const_get_coll_prop(VMG_ vm_prop_id_t prop, vm_val_t *retval,
 
72
                            const vm_val_t *self_val, vm_obj_id_t *src_obj,
 
73
                            uint *argc);
 
74
 
 
75
protected:
 
76
    /* 
 
77
     *   Create an iterator for this collection.  Fills in *retval with a
 
78
     *   reference to the new iterator object.  This iterator must refer
 
79
     *   to an immutable snapshot of the collection.  
 
80
     */
 
81
    virtual void new_iterator(VMG_ vm_val_t *retval,
 
82
                              const vm_val_t *self_val) = 0;
 
83
 
 
84
    /* 
 
85
     *   Create a "live" iterator for this collection.  Fills in *retval
 
86
     *   with a reference to the new iterator object.  This iterator must
 
87
     *   refer to the original "live" collection.  
 
88
     */
 
89
    virtual void new_live_iterator(VMG_ vm_val_t *retval,
 
90
                                   const vm_val_t *self_val) = 0;
 
91
 
 
92
    /* property evaluator - undefined property */
 
93
    int getp_undef(VMG_ vm_val_t *, const vm_val_t *, uint *)
 
94
        { return FALSE; }
 
95
    
 
96
    /* property evaluator - create iterator */
 
97
    int getp_create_iter(VMG_ vm_val_t *retval, const vm_val_t *self_val,
 
98
                         uint *argc);
 
99
 
 
100
    /* property evaluator - create live iterator */
 
101
    int getp_create_live_iter(VMG_ vm_val_t *retval,
 
102
                              const vm_val_t *self_val, uint *argc);
 
103
 
 
104
    /* property evaluation function table */
 
105
    static int (CVmObjCollection::*func_table_[])(VMG_ vm_val_t *retval,
 
106
        const vm_val_t *self_val, uint *argc);
 
107
};
 
108
 
 
109
 
 
110
/* ------------------------------------------------------------------------ */
 
111
/*
 
112
 *   Registration table object 
 
113
 */
 
114
class CVmMetaclassCollection: public CVmMetaclass
 
115
{
 
116
public:
 
117
    /* get the global name */
 
118
    const char *get_meta_name() const { return "collection/030000"; }
 
119
 
 
120
    /* create from image file */
 
121
    void create_for_image_load(VMG_ vm_obj_id_t id)
 
122
        { err_throw(VMERR_BAD_STATIC_NEW); }
 
123
 
 
124
    /* create from restoring from saved state */
 
125
    void create_for_restore(VMG_ vm_obj_id_t id)
 
126
        { err_throw(VMERR_BAD_STATIC_NEW); }
 
127
 
 
128
    /* create dynamically using stack arguments */
 
129
    vm_obj_id_t create_from_stack(VMG_ const uchar **pc_ptr, uint argc)
 
130
    {
 
131
        err_throw(VMERR_BAD_DYNAMIC_NEW);
 
132
        AFTER_ERR_THROW(return VM_INVALID_OBJ;)
 
133
    }
 
134
 
 
135
    /* call a static property */
 
136
    int call_stat_prop(VMG_ vm_val_t *result,
 
137
                       const uchar **pc_ptr, uint *argc,
 
138
                       vm_prop_id_t prop)
 
139
    {
 
140
        return CVmObjCollection::
 
141
            call_stat_prop(vmg_ result, pc_ptr, argc, prop);
 
142
    }
 
143
};
 
144
 
 
145
#endif /* VMCOLL_H */
 
146
 
 
147
/*
 
148
 *   Register the class 
 
149
 */
 
150
VM_REGISTER_METACLASS(CVmObjCollection)
 
151