mixin.lisp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. (in-package :trivial-gray-streams)
  2. (defclass trivial-gray-stream-mixin () ())
  3. (defgeneric stream-read-sequence
  4. (stream sequence start end &key &allow-other-keys))
  5. (defgeneric stream-write-sequence
  6. (stream sequence start end &key &allow-other-keys))
  7. (defgeneric stream-file-position (stream))
  8. (defgeneric (setf stream-file-position) (newval stream))
  9. (defmethod stream-write-string
  10. ((stream trivial-gray-stream-mixin) seq &optional start end)
  11. (stream-write-sequence stream seq (or start 0) (or end (length seq))))
  12. ;; Implementations should provide this default method, I believe, but
  13. ;; at least sbcl and allegro don't.
  14. (defmethod stream-terpri ((stream trivial-gray-stream-mixin))
  15. (write-char #\newline stream))
  16. (defmethod stream-file-position ((stream trivial-gray-stream-mixin))
  17. nil)
  18. (defmethod (setf stream-file-position)
  19. (newval (stream trivial-gray-stream-mixin))
  20. (declare (ignore newval))
  21. nil)
  22. #+allegro
  23. (progn
  24. (defmethod excl:stream-read-sequence
  25. ((s trivial-gray-stream-mixin) seq &optional start end)
  26. (stream-read-sequence s seq (or start 0) (or end (length seq))))
  27. (defmethod stream:stream-write-sequence
  28. ((s trivial-gray-stream-mixin) seq &optional start end)
  29. (stream-write-sequence s seq (or start 0) (or end (length seq)))))
  30. #+cmu
  31. (progn
  32. (defmethod ext:stream-read-sequence
  33. ((s trivial-gray-stream-mixin) seq &optional start end)
  34. (stream-read-sequence s seq (or start 0) (or end (length seq))))
  35. (defmethod ext:stream-write-sequence
  36. ((s trivial-gray-stream-mixin) seq &optional start end)
  37. (stream-write-sequence s seq (or start 0) (or end (length seq)))))
  38. #+lispworks
  39. (progn
  40. (defmethod stream:stream-read-sequence
  41. ((s trivial-gray-stream-mixin) seq start end)
  42. (stream-read-sequence s seq start end))
  43. (defmethod stream:stream-write-sequence
  44. ((s trivial-gray-stream-mixin) seq start end)
  45. (stream-write-sequence s seq start end))
  46. (defmethod stream:stream-file-position ((stream trivial-gray-stream-mixin))
  47. (stream-file-position stream))
  48. (defmethod (setf stream:stream-file-position)
  49. (newval (stream trivial-gray-stream-mixin))
  50. (setf (stream-file-position stream) newval)))
  51. #+openmcl
  52. (progn
  53. (defmethod ccl:stream-read-vector
  54. ((s trivial-gray-stream-mixin) seq start end)
  55. (stream-read-sequence s seq start end))
  56. (defmethod ccl:stream-write-vector
  57. ((s trivial-gray-stream-mixin) seq start end)
  58. (stream-write-sequence s seq start end)))
  59. #+clisp
  60. (progn
  61. (defmethod gray:stream-read-byte-sequence
  62. ((s trivial-gray-stream-mixin)
  63. seq
  64. &optional start end no-hang interactive)
  65. (when no-hang
  66. (error "this stream does not support the NO-HANG argument"))
  67. (when interactive
  68. (error "this stream does not support the INTERACTIVE argument"))
  69. (stream-read-sequence s seq start end))
  70. (defmethod gray:stream-write-byte-sequence
  71. ((s trivial-gray-stream-mixin)
  72. seq
  73. &optional start end no-hang interactive)
  74. (when no-hang
  75. (error "this stream does not support the NO-HANG argument"))
  76. (when interactive
  77. (error "this stream does not support the INTERACTIVE argument"))
  78. (stream-write-sequence s seq start end))
  79. (defmethod gray:stream-read-char-sequence
  80. ((s trivial-gray-stream-mixin) seq &optional start end)
  81. (stream-read-sequence s seq start end))
  82. (defmethod gray:stream-write-char-sequence
  83. ((s trivial-gray-stream-mixin) seq &optional start end)
  84. (stream-write-sequence s seq start end))
  85. (defmethod gray:stream-position ((stream trivial-gray-stream-mixin) position)
  86. (if position
  87. (setf (stream-file-position stream) position)
  88. (stream-file-position stream))))
  89. #+sbcl
  90. (progn
  91. (defmethod sb-gray:stream-read-sequence
  92. ((s trivial-gray-stream-mixin) seq &optional start end)
  93. (stream-read-sequence s seq (or start 0) (or end (length seq))))
  94. (defmethod sb-gray:stream-write-sequence
  95. ((s trivial-gray-stream-mixin) seq &optional start end)
  96. (stream-write-sequence s seq (or start 0) (or end (length seq))))
  97. ;; SBCL extension:
  98. (defmethod sb-gray:stream-line-length ((stream trivial-gray-stream-mixin))
  99. 80))
  100. #+ecl
  101. (progn
  102. (defmethod gray:stream-read-sequence
  103. ((s trivial-gray-stream-mixin) seq &optional start end)
  104. (stream-read-sequence s seq (or start 0) (or end (length seq))))
  105. (defmethod gray:stream-write-sequence
  106. ((s trivial-gray-stream-mixin) seq &optional start end)
  107. (stream-write-sequence s seq (or start 0) (or end (length seq)))))