1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1997,2008 Oracle.  All rights reserved.
5 *
6 * $Id: cxx_multi.cpp,v 12.10 2008/01/08 20:58:09 bostic Exp $
7 */
8
9#include "db_config.h"
10
11#include "db_int.h"
12
13#include "db_cxx.h"
14
15DbMultipleIterator::DbMultipleIterator(const Dbt &dbt)
16 : data_((u_int8_t*)dbt.get_data()),
17   p_((u_int32_t*)(data_ + dbt.get_ulen() - sizeof(u_int32_t)))
18{
19}
20
21bool DbMultipleDataIterator::next(Dbt &data)
22{
23	if (*p_ == (u_int32_t)-1) {
24		data.set_data(0);
25		data.set_size(0);
26		p_ = 0;
27	} else {
28		data.set_data(data_ + *p_--);
29		data.set_size(*p_--);
30		if (data.get_size() == 0 && data.get_data() == data_)
31			data.set_data(0);
32	}
33	return (p_ != 0);
34}
35
36bool DbMultipleKeyDataIterator::next(Dbt &key, Dbt &data)
37{
38	if (*p_ == (u_int32_t)-1) {
39		key.set_data(0);
40		key.set_size(0);
41		data.set_data(0);
42		data.set_size(0);
43		p_ = 0;
44	} else {
45		key.set_data(data_ + *p_--);
46		key.set_size(*p_--);
47		data.set_data(data_ + *p_--);
48		data.set_size(*p_--);
49	}
50	return (p_ != 0);
51}
52
53bool DbMultipleRecnoDataIterator::next(db_recno_t &recno, Dbt &data)
54{
55	if (*p_ == (u_int32_t)0) {
56		recno = 0;
57		data.set_data(0);
58		data.set_size(0);
59		p_ = 0;
60	} else {
61		recno = *p_--;
62		data.set_data(data_ + *p_--);
63		data.set_size(*p_--);
64	}
65	return (p_ != 0);
66}
67