blob: dd3a252efafbc4063e417abe6aa194ff0a8d7b26 [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* etch_collection.h
* definitions common to collections
*/
#ifndef ETCHCOLLECTION_H
#define ETCHCOLLECTION_H
#include "etch.h"
#include "etch_object.h"
#ifdef __cplusplus
extern "C" {
#endif
#define ETCH_SYNC_SET 1
#define ETCH_SYNC_TRY 2
#define ETCH_SYNC_REL 3
#define ETCH_SYNC_DEL 4
#define ETCH_SYNC_SET_ ((void*) ETCH_SYNC_SET)
#define ETCH_SYNC_TRY_ ((void*) ETCH_SYNC_TRY)
#define ETCH_SYNC_REL_ ((void*) ETCH_SYNC_REL)
#define ETCH_SYNC_DEL_ ((void*) ETCH_SYNC_DEL)
struct i_iterable;
struct etch_iterator;
/**
* method signatures for i_iterable interface.
* each accepts an iterator object as first parameter. the iterator constructor
* should call first(), thus establishing a current position. next() should operate
* as first() if there is no current position.
*/
typedef int (*iterable_first) (struct etch_iterator*);
typedef int (*iterable_next) (struct etch_iterator*);
typedef int (*iterable_has_next) (struct etch_iterator*);
/**
* etch_iterator: iterator object for any i_iterable.
*/
typedef struct etch_iterator
{
etch_object object;
iterable_first first;
iterable_next next;
iterable_has_next has_next;
int ordinal; /* 1-based position index */
void* collection; /* underlying collection */
void* current_value; /* data at current posn */
void* current_key; /* key at current posn */
unsigned char is_own_collection;
} etch_iterator;
/**
* i_iterable: vtable for iterable interface
*/
struct i_iterable
{
etch_object object;
etchparentinfo* inherits_from;
iterable_first first; /* set current position at first entry */
iterable_next next; /* set current position at next entry */
iterable_has_next has_next; /* return TRUE if next will succeed */
};
typedef struct i_iterable i_iterable;
/**
* new_iterable
* constructor for i_iterable interface
*/
i_iterable* new_iterable(i_iterable* thisp, i_iterable* parent,
iterable_first, iterable_next, iterable_has_next);
/**
* new_iterator(), set_iterator(), destroy_iterator
* constructors and destructors for etch_iterator
*/
etch_iterator* new_iterator(void* collection, i_iterable* iterable);
int set_iterator(etch_iterator* thisp, void* collection, i_iterable* iterable);
/* should be static! call via vtable */
int destroy_iterator(void*);
etch_iterator* new_empty_iterator();
int etch_comparator_noteq(void* a, void* b);
int etch_comparator_equal(void* a, void* b);
#ifdef __cplusplus
}
#endif
#endif /* #ifndef ETCHCOLLECTION_H */