public static ps_seg_t kws_search_seg_iter(ps_search_t search)
        {
            kws_search_t      kwss = (kws_search_t)search;
            kws_seg_t         itor;
            Pointer <gnode_t> detect_head = kwss.detections.Deref.detect_list;

            while (detect_head.IsNonNull && ((Pointer <kws_detection_t>)glist.gnode_ptr(detect_head)).Deref.ef > kwss.frame - kwss.delay)
            {
                detect_head = glist.gnode_next(detect_head);
            }

            if (detect_head.IsNull)
            {
                return(null);
            }

            itor            = new kws_seg_t();
            itor.vt         = kws_segfuncs;
            itor.search     = search;
            itor.lwf        = 1.0f;
            itor.detection  = detect_head;
            itor.last_frame = kwss.frame - kwss.delay;
            kws_seg_fill(itor);
            return((ps_seg_t)itor);
        }
        public static void kws_seg_fill(kws_seg_t itor)
        {
            Pointer <kws_detection_t> detection = (Pointer <kws_detection_t>)glist.gnode_ptr(itor.detection);

            itor.word = detection.Deref.keyphrase;
            itor.sf   = detection.Deref.sf;
            itor.ef   = detection.Deref.ef;
            itor.prob = detection.Deref.prob;
            itor.ascr = detection.Deref.ascr;
            itor.lscr = 0;
        }
        public static ps_seg_t kws_seg_next(ps_seg_t seg)
        {
            kws_seg_t itor = (kws_seg_t)seg;

            Pointer <gnode_t> detect_head = glist.gnode_next(itor.detection);

            while (detect_head.IsNonNull && ((Pointer <kws_detection_t>)glist.gnode_ptr(detect_head)).Deref.ef > itor.last_frame)
            {
                detect_head = glist.gnode_next(detect_head);
            }
            itor.detection = detect_head;

            if (itor.detection.IsNull)
            {
                kws_seg_free(seg);
                return(null);
            }

            kws_seg_fill(itor);

            return(seg);
        }