[前][次][番号順一覧][スレッド一覧]

ruby-changes:67793

From: =E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3 <ko1@a...>
Date: Fri, 10 Sep 2021 20:02:02 +0900 (JST)
Subject: [ruby-changes:67793] ce54282b75 (master): include/ruby/internal/intern/array.h: add doxygen

https://git.ruby-lang.org/ruby.git/commit/?id=ce54282b75

From ce54282b75761b97ea961ea5fe19cef244f82f97 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?=
 <shyouhei@r...>
Date: Fri, 4 Jun 2021 23:53:32 +0900
Subject: include/ruby/internal/intern/array.h: add doxygen

Must not be a bad idea to improve documents. [ci skip]
---
 array.c                              |   8 -
 include/ruby/internal/intern/array.h | 658 ++++++++++++++++++++++++++++++++---
 2 files changed, 619 insertions(+), 47 deletions(-)

diff --git a/array.c b/array.c
index 50a61db..66dc525 100644
--- a/array.c
+++ b/array.c
@@ -2234,14 +2234,6 @@ rb_ary_set_len(VALUE ary, long len) https://github.com/ruby/ruby/blob/trunk/array.c#L2234
     ARY_SET_LEN(ary, len);
 }
 
-/*!
- * expands or shrinks \a ary to \a len elements.
- * expanded region will be filled with Qnil.
- * \param ary  an array
- * \param len  new size
- * \return     \a ary
- * \post       the size of \a ary is \a len.
- */
 VALUE
 rb_ary_resize(VALUE ary, long len)
 {
diff --git a/include/ruby/internal/intern/array.h b/include/ruby/internal/intern/array.h
index 6e93c4c..5ed3073 100644
--- a/include/ruby/internal/intern/array.h
+++ b/include/ruby/internal/intern/array.h
@@ -20,58 +20,638 @@ https://github.com/ruby/ruby/blob/trunk/include/ruby/internal/intern/array.h#L20
  *             extension libraries.  They could be written in C++98.
  * @brief      Public APIs related to ::rb_cArray.
  */
+#include "ruby/internal/attr/noalias.h"
+#include "ruby/internal/attr/noexcept.h"
+#include "ruby/internal/attr/nonnull.h"
+#include "ruby/internal/attr/pure.h"
 #include "ruby/internal/dllexport.h"
 #include "ruby/internal/value.h"
 
 RBIMPL_SYMBOL_EXPORT_BEGIN()
 
 /* array.c */
-void rb_mem_clear(VALUE*, long);
-VALUE rb_assoc_new(VALUE, VALUE);
-VALUE rb_check_array_type(VALUE);
+
+RBIMPL_ATTR_NONNULL(())
+RBIMPL_ATTR_NOALIAS()
+/**
+ * Fills the memory region with a series of ::RUBY_Qnil.
+ *
+ * @param[out]  buf  Buffer to squash.
+ * @param[in]   len  Number of objects of `buf`.
+ * @post        `buf` is filled with ::RUBY_Qnil.
+ */
+void rb_mem_clear(VALUE *buf, long len)
+    RBIMPL_ATTR_NOEXCEPT(true)
+    ;
+
+/**
+ * Identical  to  rb_ary_new_from_values(),  except   it  expects  exactly  two
+ * parameters.
+ *
+ * @param[in]  car  Arbitrary ruby object.
+ * @param[in]  cdr  Arbitrary ruby object.
+ * @return     An  allocated new  array, of  length 2,  whose contents  are the
+ *             passed objects.
+ */
+VALUE rb_assoc_new(VALUE car, VALUE cdr);
+
+/**
+ * Try  converting an  object to  its array  representation using  its `to_ary`
+ * method, if any.  If there is no such thing, returns ::RUBY_Qnil.
+ *
+ * @param[in]  obj            Arbitrary ruby object to convert.
+ * @exception  rb_eTypeError  `obj.to_ary` returned something non-Array.
+ * @retval     RUBY_Qnil      No conversion from `obj` to array defined.
+ * @retval     otherwise      Converted array representation of `obj`.
+ * @see        rb_io_check_io
+ * @see        rb_check_string_type
+ * @see        rb_check_hash_type
+ */
+VALUE rb_check_array_type(VALUE obj);
+
+/**
+ * Allocates a new, empty array.
+ *
+ * @return  An allocated new array, whose length is 0.
+ */
 VALUE rb_ary_new(void);
+
+/**
+ * Identical to rb_ary_new(),  except it additionally specifies  how many rooms
+ * of  objects it  should allocate.   This way  you can  create an  array whose
+ * capacity is  bigger than the  length of  it.  If you  can say that  an array
+ * grows to a  specific amount, this could be effective  than resizing an array
+ * over and over again and again.
+ *
+ * @param[in]  capa  Designed capacity of the generating array.
+ * @return     An empty array, whose capacity is `capa`.
+ */
 VALUE rb_ary_new_capa(long capa);
+
+/**
+ * Constructs an array from the passed objects.
+ *
+ * @param[in]  n    Number of passed objects.
+ * @param[in]  ...  Arbitrary ruby objects, filled into the returning array.
+ * @return     An array of size `n`, whose contents are the passed objects.
+ */
 VALUE rb_ary_new_from_args(long n, ...);
+
+RBIMPL_ATTR_NONNULL(())
+/**
+ * Identical to rb_ary_new_from_args(), except how objects are passed.
+ *
+ * @param[in]  n     Number of objects of `elts`.
+ * @param[in]  elts  Arbitrary ruby objects, filled into the returning array.
+ * @return     An array of size `n`, whose contents are the passed objects.
+ */
 VALUE rb_ary_new_from_values(long n, const VALUE *elts);
-VALUE rb_ary_tmp_new(long);
-void rb_ary_free(VALUE);
-void rb_ary_modify(VALUE);
-VALUE rb_ary_freeze(VALUE);
-VALUE rb_ary_shared_with_p(VALUE, VALUE);
-VALUE rb_ary_aref(int, const VALUE*, VALUE);
-VALUE rb_ary_subseq(VALUE, long, long);
-void rb_ary_store(VALUE, long, VALUE);
-VALUE rb_ary_dup(VALUE);
+
+/**
+ * Allocates a  "temporary" array.   This is  a hidden  empty array.   Handy on
+ * occasions.
+ *
+ * @param[in]  capa  Designed capacity of the array.
+ * @return     A hidden, empty array.
+ * @see        rb_obj_hide()
+ */
+VALUE rb_ary_tmp_new(long capa);
+
+/**
+ * Destroys the given array for no reason.
+ *
+ * @warning  DO NOT USE IT.
+ * @warning  Leave this task to our GC.
+ * @warning  It was a wrong indea at the first place to let you know about it.
+ *
+ * @param[out]  ary  The array to be executed.
+ * @post        The given array no longer exists.
+ * @note        Maybe `Array#clear` could be what you want.
+ *
+ * @internal
+ *
+ * Should have moved this to `internal/array.h`.
+ */
+void rb_ary_free(VALUE ary);
+
+/**
+ * Declares that the array is about to  be modified.  This for instance let the
+ * array have a dedicated backend storage.
+ *
+ * @param[out]  ary               Array about to be modified.
+ * @exception   rb_eFrozenError   `ary` is frozen.
+ * @post        Upon  successful return  the  passed array  is  eligible to  be
+ *              modified.
+ */
+void rb_ary_modify(VALUE ary);
+
+/** @alias{rb_obj_freeze} */
+VALUE rb_ary_freeze(VALUE obj);
+
+RBIMPL_ATTR_PURE()
+/**
+ * Queries if the passed two arrays share the same backend storage.  A use-case
+ * for  knowing  such  property is  to  take  a  snapshot  of an  array  (using
+ * e.g. rb_ary_replace()), then  check later if that snapshot  still shares the
+ * storage with  the original.  Taking  a snapshot is ultra-cheap.   If nothing
+ * happens the impact shall be minimal.   But if someone modifies the original,
+ * that entity shall pay the cost  of copy-on-write.  You can detect that using
+ * this API.
+ *
+ * @param[in]  lhs          Comparison LHS.
+ * @param[in]  rhs          Comparison RHS.
+ * @retval     RUBY_Qtrue   They share the same backend storage.
+ * @retval     RUBY_Qfalse  They are distinct.
+ * @pre        Both arguments must be of ::RUBY_T_ARRAY.
+ */
+VALUE rb_ary_shared_with_p(VALUE lhs, VALUE rhs);
+
+/**
+ * Queries element(s) of  an array.  This is  complicated!  Refer `Array#slice`
+ * document for the complete description of how it behaves.
+ *
+ * @param[in]  argc            Number of objects of `argv`.
+ * @param[in]  argv            Up to 2 objects.
+ * @param[in]  ary             Target array.
+ * @exception  rb_eTypeError   `argv` (or its part) includes non-Integer.
+ * @exception  rb_eRangeError  rb_cArithSeq is passed, and is OOB.
+ * @return     An  element  (if  requested),  or   an  array  of  elements  (if
+ *             requested), or ::RUBY_Qnil (if index OOB).
+ *
+ * @internal
+ *
+ * ```rbs
+ * # "int" is ::Integer or `#to_int`, defined in builtin.rbs
+ *
+ * class ::Array[unchecked out T]
+ *   def slice
+ *     : (int i)                 -> T?
+ *     | (int beg, int len)      -> ::Array[T]?
+ *     | (Range[int] r)          -> ::Array[T]?
+ *     | (ArithmeticSequence as) -> ::Array[T]? # This also raises RagneError.
+ * end
+ * ```
+ */
+VALUE rb_ary_aref(int argc, const VALUE *argv, VALUE ary);
+
+/**
+ * Obtains a part of the passed array.
+ *
+ * @param[in]  ary        Target array.
+ * @param[in]  beg        Subpart index.
+ * @param[in]  len        Requested length of returning array.
+ * @retval     RUBY_Qnil  Requested range out of bounds of `ary`.
+ * @retval     otherwise  An  allocated new  array whose  contents are  `ary`'s
+ *                        `beg` to `len`.
+ * @note       Return  array  can  be  shorter than  `len`  when  for  instance
+ *             `[0, 1, 2, 3]`'s 4th to 1,000,000,000th is requested.
+ */
+VALUE rb_ary_subseq(VALUE ary, long beg, long len);
+
+/**
+ * Destructively stores  the passed value  to the passed array's  passed index.
+ * It also resizes  the array's backend storage so that  the requested index is
+ * not out of bounds.
+ *
+ * @param[out]  ary              Target array to modify.
+ * @param[in]   key              Where to store `val`.
+ * @param[in]   val              What to store at `key`.
+ * @exception   rb_eFrozenError  `ary` is frozen.
+ * @exception   rb_eIndexError   `key` is negative.
+ * @post        `ary`'s `key`th position is occupied with `val`.
+ * @post        Depending on `key` and previous  length of `ary` this operation
+ *              can  also create  a series  of "hole"  positions inside  of the
+ *              backend storage.  They are filled with ::RUBY_Qnil.
+ */
+void rb_ary_store(VALUE ary, long key, VALUE val);
+
+/**
+ * Duplicates an array.
+ *
+ * @param[in]  ary  Target to duplicate.
+ * @return     An allocated new array whose contents are identical to `ary`.
+ *
+ * @internal
+ *
+ * Not sure why this has to be something different from `ary_make_shared_copy`,
+ * which seems much efficient.
+ */
+VALUE rb_ary_dup(VALUE ary);
+
+/**
+ * I guess there  is no use case  of this function in  extension libraries, but
+ * this is a routine identical to rb_ary_dup().  This makes the most sense when
+ * the passed array is formerly hidden by rb_obj_hide().
+ *
+ * @param[in]  ary  An array, possibly hidden.
+ * @return     A duplicated new instance of ::rb_cArray.
+ */
 VALUE rb_ary_resurrect(VALUE ary);
-VALUE rb (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]