File: dynamic-class-defs.lisp

package info (click to toggle)
cl-containers 20170403-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,072 kB
  • ctags: 1,387
  • sloc: lisp: 8,341; makefile: 14
file content (95 lines) | stat: -rw-r--r-- 2,800 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
;; this is the only part that depends on dynamic-classes

(in-package #:cl-containers)

(defvar *current-iteratee* nil)
  
(defmethod make-container ((classes list) &rest args)
  (let ((name (find-or-create-class
	       'abstract-container classes))) 
    (apply #'make-instance name args)))

(add-parameter->dynamic-class
 :iterator :transform 'transforming-iterator-mixin)

(add-parameter->dynamic-class
 :iterator :filter 'filtered-iterator-mixin)

(add-parameter->dynamic-class
 :iterator :unique 'unique-value-iterator-mixin)

(add-parameter->dynamic-class
 :iterator :circular 'circular-iterator-mixin)

#+(or)
;;?? Gary King 2005-07-18: didn't work??
(add-dynamic-class-for-parameters :generator 'arithmetic-sequence-generator
                                    nil '(:start :by))

(add-parameter->dynamic-class
 :generator :start 'arithmetic-sequence-generator)

(add-parameter->dynamic-class
 :generator :by 'arithmetic-sequence-generator)

(add-parameter->dynamic-class
 :generator :transform 'transforming-iterator-mixin)

(add-parameter->dynamic-class
 :generator :filter 'filtered-iterator-mixin)

(add-parameter->dynamic-class
 :generator :unique 'unique-value-iterator-mixin)

(add-parameter->dynamic-class
 :generator :end 'finite-arithmetic-sequence-generator)

(defmethod existing-subclass
    ((class-type (eql :iterator)) class-list)
  (find-existing-subclass 'abstract-generator class-list))

(defmethod existing-subclass
    ((class-type (eql :generator)) class-list)
  (find-existing-subclass 'abstract-generator class-list))

(defun determine-iterator-class (iteratee iterator-class &rest parameters)
  (let ((*current-iteratee* iteratee))
    (apply #'determine-dynamic-class 
           :iterator 
           iterator-class
           parameters)))

(defun determine-generator-class (generator-class &rest parameters)
  (apply #'determine-dynamic-class
	 :generator generator-class parameters))

(defmethod include-class-dependencies
    ((class-type (eql :iterator)) 
     dynamic-class class-list &rest parameters
     &key treat-contents-as &allow-other-keys)
  (declare (ignore dynamic-class parameters))
  (append class-list 
          (list
           (or
            (and treat-contents-as
                 (class-for-contents-as *current-iteratee* treat-contents-as))
            (base-class-for-iteratee *current-iteratee*)))))

;;;;


(defmethod class-for-contents-as ((contents t) (as t))
  (values nil))
  
(defmethod base-class-for-iteratee ((container list))
  'list-iterator)

(defmethod base-class-for-iteratee ((container array))
  'array-iterator)

(defmethod base-class-for-iteratee ((container hash-table))
  'hash-table-iterator)

(defmethod base-class-for-iteratee ((container uses-contents-mixin))
  (base-class-for-iteratee (contents container)))