    /*
     *  call-seq:
     *     pq.clone -> pq_clone
     *
     *  Returns a shallow clone of the priority queue. That is only the priority
     *  queue is cloned, its contents are not cloned.
     */
    static VALUE
    frt_pq_clone(VALUE self)
    {
        PriQ *pq, *new_pq = ALLOC(PriQ);
        GET_PQ(pq, self);
        memcpy(new_pq, pq, sizeof(PriQ));
        new_pq->heap = ALLOC_N(VALUE, new_pq->mem_capa);
        memcpy(new_pq->heap, pq->heap, sizeof(VALUE) * (new_pq->size + 1));

        return Data_Wrap_Struct(cPriorityQueue, &frt_pq_mark, &frt_pq_free, new_pq);
    }