+/* Get the thread IDs for 'message', returning a notmuch_thread_ids_t
+ * object which can be used to iterate over all thread IDs.
+ *
+ * The thread_ids object is owned by the message and as such, will
+ * only be valid for as long as the message is valid, (which is until
+ * the query from which it derived is destroyed).
+ *
+ * Typical usage might be:
+ *
+ * notmuch_message_t *message;
+ * notmuch_thread_ids_t *thread_ids;
+ * const char *thread_id;
+ *
+ * message = notmuch_database_find_message (database, message_id);
+ *
+ * for (thread_ids = notmuch_message_get_thread_ids (message);
+ * notmuch_thread_ids_has_more (thread_ids);
+ * notmuch_thread_ids_advance (thread_ids))
+ * {
+ * thread_id = notmuch_thread_ids_get (thread_ids);
+ * ....
+ * }
+ *
+ * notmuch_message_destroy (message);
+ *
+ * Note that there's no explicit destructor needed for the
+ * notmuch_thread_ids_t object. (For consistency, we do provide a
+ * notmuch_thread_ids_destroy function, but there's no good reason to
+ * call it if the message is about to be destroyed).
+ */
+notmuch_thread_ids_t *
+notmuch_message_get_thread_ids (notmuch_message_t *message);
+
+/* Destroy a notmuch_message_t object.
+ *
+ * It can be useful to call this function in the case of a single
+ * query object with many messages in the result, (such as iterating
+ * over the entire database). Otherwise, it's fine to never call this
+ * function and there will still be no memory leaks. (The memory from
+ * the messages get reclaimed when the containing query is destroyed.)
+ */
+void
+notmuch_message_destroy (notmuch_message_t *message);
+