bvector.hpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /* Declarations for the byte vector type.
  2. This file is part of khipu.
  3. khipu is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation; either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program. If not, see <https://www.gnu.org/licenses/>. */
  13. #ifndef __KP_BVECTOR__
  14. #define __KP_BVECTOR__ 1
  15. #include "interp.hpp"
  16. #include "initop.hpp"
  17. KP_DECLS_BEGIN
  18. struct bvector : public varobj
  19. {
  20. static const int code = typecode::BVECTOR;
  21. unsigned char *data;
  22. uint32_t nbytes;
  23. static bvector* alloc_raw (uint32_t cap);
  24. // Needed by the raw_acc interface.
  25. uint32_t& len_ref ()
  26. {
  27. return (this->nbytes);
  28. }
  29. unsigned char* data_ptr ()
  30. {
  31. return (this->data);
  32. }
  33. void local_init (const void *ptr, uint32_t nbytes)
  34. {
  35. this->data = (unsigned char *)ptr;
  36. this->nbytes = nbytes;
  37. }
  38. };
  39. inline bvector* as_bvector (object obj)
  40. {
  41. return ((bvector *)unmask (obj));
  42. }
  43. #ifdef KP_ARCH_WIDE
  44. inline constexpr bool bvector_p (object obj)
  45. {
  46. return (itype (obj) == typecode::BVECTOR);
  47. }
  48. #else
  49. inline bool bvector_p (object obj)
  50. {
  51. return (varobj_p (obj) && as_varobj(obj)->vo_type == typecode::BVECTOR);
  52. }
  53. #endif
  54. inline uint32_t
  55. len_b (object obj)
  56. {
  57. return (as_bvector(obj)->nbytes);
  58. }
  59. /* Byte vectors and strings share a large part of the implementation,
  60. * since the latter can be considered a subtype of the former. */
  61. struct stream;
  62. struct io_info;
  63. struct pack_info;
  64. // Allocate a byte vector with room for NBYTES bytes.
  65. KP_EXPORT result<object> alloc_bvector (interpreter *interp, uint32_t nbytes);
  66. // Index a byte vector.
  67. KP_EXPORT result<object> get_b (interpreter *interp,
  68. object bvector, object idx, object dfl);
  69. // Get the subsequence of a byte vector.
  70. KP_EXPORT result<object> subseq_b (interpreter *interp,
  71. object bvector, object ix1, object ix2);
  72. // Replace the subsequence of a byte vector.
  73. KP_EXPORT result<object> rpl_b (interpreter *interp, object bvector,
  74. object ix1, object ix2, object rpl);
  75. // Erase the subsequence of a byte vector.
  76. KP_EXPORT result<object> erase_b (interpreter *interp,
  77. object bvector, object ix1, object ix2);
  78. // Insert into a byte vector.
  79. KP_EXPORT result<object> insert_b (interpreter *interp,
  80. object bvector, object ix1, object ins);
  81. // Destructively set an element inside a byte vector.
  82. KP_EXPORT result<object> nput_b (interpreter *interp,
  83. object bvector, object idx, object byte);
  84. // Copy a byte vector.
  85. KP_EXPORT result<object> copy_b (interpreter *interp, object obj, bool deep);
  86. // Iterator interface for a byte vector.
  87. KP_EXPORT result<object> iter_b (interpreter *interp,
  88. object obj, object token, bool adv);
  89. // Write a byte vector to a stream.
  90. KP_EXPORT result<int64_t> write_b (interpreter *interp,
  91. stream *strm, object bvector, io_info& info);
  92. // Serialize a byte vector in a stream.
  93. KP_EXPORT result<int64_t> pack_b (interpreter *interp,
  94. stream *strm, object obj, pack_info& info);
  95. // Deserialize a byte vector from a stream.
  96. KP_EXPORT result<object> unpack_b (interpreter *interp,
  97. stream *strm, pack_info& info, bool save);
  98. // Concatenate byte vectors BV1 and BV2.
  99. KP_EXPORT result<object> add_bb (interpreter *interp, object bv1, object bv2);
  100. // Concatenate ARGC byte vectors from ARGV.
  101. KP_EXPORT result<object> concat_b (interpreter *interp, object *argv, int argc);
  102. // Multiply a byte vector with an integer.
  103. KP_EXPORT result<object> mul_ib (interpreter *interp,
  104. object ix, object bvector);
  105. // Compare byte vectors V1 and V2.
  106. KP_EXPORT int cmp_bb (interpreter *interp, object v1, object v2);
  107. /* Let's take advantage of the fact that both types
  108. * have the same internal representation. */
  109. inline int cmp_bs (interpreter *interp, object b, object s)
  110. {
  111. return (cmp_bb (interp, b, s));
  112. }
  113. inline int cmp_ss (interpreter *interp, object s1, object s2)
  114. {
  115. return (cmp_bb (interp, s1, s2));
  116. }
  117. // Test for byte vector equality.
  118. KP_EXPORT bool eq_bb (interpreter *interp, object v1, object v2);
  119. inline bool eq_bs (interpreter *interp, object b, object s)
  120. {
  121. return (eq_bb (interp, b, s));
  122. }
  123. inline bool eq_ss (interpreter *interp, object s1, object s2)
  124. {
  125. return (eq_bb (interp, s1, s2));
  126. }
  127. // Hash the buffer [PTR .. PTR + LEN).
  128. KP_EXPORT uint32_t hashbuf (const void *ptr, uint32_t len);
  129. // Compute the hashcode of a byte vector.
  130. KP_EXPORT uint32_t hash_b (interpreter *interp, object obj);
  131. // Reverse a byte vector.
  132. KP_EXPORT result<object> reverse_b (interpreter *interp, object obj);
  133. // Destructively reverse a byte vector.
  134. KP_EXPORT result<object> nreverse_b (interpreter *interp, object obj);
  135. // Get the last element of a byte vector.
  136. KP_EXPORT result<object> last_b (interpreter *interp, object obj);
  137. // Find a byte or bvector.
  138. KP_EXPORT result<object> find_b (interpreter *interp, object obj,
  139. object key, object start,
  140. object end, object test);
  141. // Create a stream with from byte vector BV.
  142. KP_EXPORT result<stream*> bvstream (interpreter *interp, object bv, int mode);
  143. // Get the byte vector from stream STRM.
  144. KP_EXPORT result<object> bvstream_get (interpreter *interp, stream *strm);
  145. KP_EXPORT unsigned char* bvstream_data (stream *strm, uint32_t& size);
  146. // Init OP for byte vectors.
  147. KP_EXPORT init_op init_bvector;
  148. KP_DECLS_END
  149. #endif