| 1897 | } |
| 1898 | |
| 1899 | CV_IMPL void |
| 1900 | cvSeqSort( CvSeq* seq, CvCmpFunc cmp_func, void* aux ) |
| 1901 | { |
| 1902 | int elem_size; |
| 1903 | int isort_thresh = 7; |
| 1904 | CvSeqReader left, right; |
| 1905 | int sp = 0; |
| 1906 | |
| 1907 | struct |
| 1908 | { |
| 1909 | CvSeqReaderPos lb; |
| 1910 | CvSeqReaderPos ub; |
| 1911 | } |
| 1912 | stack[48]; |
| 1913 | |
| 1914 | if( !CV_IS_SEQ(seq) ) |
| 1915 | CV_Error( !seq ? CV_StsNullPtr : CV_StsBadArg, "Bad input sequence" ); |
| 1916 | |
| 1917 | if( !cmp_func ) |
| 1918 | CV_Error( CV_StsNullPtr, "Null compare function" ); |
| 1919 | |
| 1920 | if( seq->total <= 1 ) |
| 1921 | return; |
| 1922 | |
| 1923 | elem_size = seq->elem_size; |
| 1924 | isort_thresh *= elem_size; |
| 1925 | |
| 1926 | cvStartReadSeq( seq, &left, 0 ); |
| 1927 | right = left; |
| 1928 | CV_SAVE_READER_POS( left, stack[0].lb ); |
| 1929 | CV_PREV_SEQ_ELEM( elem_size, right ); |
| 1930 | CV_SAVE_READER_POS( right, stack[0].ub ); |
| 1931 | |
| 1932 | while( sp >= 0 ) |
| 1933 | { |
| 1934 | CV_RESTORE_READER_POS( left, stack[sp].lb ); |
| 1935 | CV_RESTORE_READER_POS( right, stack[sp].ub ); |
| 1936 | sp--; |
| 1937 | |
| 1938 | for(;;) |
| 1939 | { |
| 1940 | int i, n, m; |
| 1941 | CvSeqReader ptr, ptr2; |
| 1942 | |
| 1943 | if( left.block == right.block ) |
| 1944 | n = (int)(right.ptr - left.ptr) + elem_size; |
| 1945 | else |
| 1946 | { |
| 1947 | n = cvGetSeqReaderPos( &right ); |
| 1948 | n = (n - cvGetSeqReaderPos( &left ) + 1)*elem_size; |
| 1949 | } |
| 1950 | |
| 1951 | if( n <= isort_thresh ) |
| 1952 | { |
| 1953 | insert_sort: |
| 1954 | ptr = ptr2 = left; |
| 1955 | CV_NEXT_SEQ_ELEM( elem_size, ptr ); |
| 1956 | CV_NEXT_SEQ_ELEM( elem_size, right ); |
no test coverage detected