blob: 048b36dba051243e783b7ce82bd57d52e568e80d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Created on: 6 avr. 2011
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef BUILTINCONTAINER_H_
#define BUILTINCONTAINER_H_
#include <fml/builtin/BuiltinForm.h>
#include <collection/BFContainer.h>
namespace sep
{
class BuiltinArray;
class ContainerTypeSpecifier;
class BuiltinCollection :
public BuiltinForm ,
AVM_INJECT_INSTANCE_COUNTER_CLASS( BuiltinCollection )
{
public:
/**
* CONSTRUCTOR
* Default
*/
BuiltinCollection(class_kind_t aClassKind)
: BuiltinForm( aClassKind )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
BuiltinCollection(const BuiltinCollection & aBuiltinCollection)
: BuiltinForm( aBuiltinCollection )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~BuiltinCollection()
{
//!! NOTHING
}
/**
* GETTER - SETTER
* mCapacity
*/
virtual avm_size_t capacity() const = 0;
inline long realCapacity() const
{
return( (capacity() == AVM_NUMERIC_MAX_SIZE_T)? -1 : capacity() );
}
virtual void setCapacity(long aCapacity) = 0;
inline bool isFinite() const
{
return( capacity() < AVM_NUMERIC_MAX_SIZE_T );
}
inline bool isInfinite() const
{
return( capacity() == AVM_NUMERIC_MAX_SIZE_T );
}
/*
***************************************************************************
* GETTER
* emptiness
***************************************************************************
*/
virtual bool empty() const = 0;
virtual bool nonempty() const = 0;
virtual bool singleton() const = 0;
virtual bool populated() const = 0;
inline virtual bool full() const
{
return( size() == capacity() );
}
virtual avm_size_t size() const = 0;
virtual void resize(avm_size_t newSize) = 0;
/**
* INTERFACE
*/
virtual bool contains(const BF & arg) const = 0;
};
class BuiltinContainer :
public BuiltinCollection,
AVM_INJECT_INSTANCE_COUNTER_CLASS( BuiltinContainer )
{
protected:
/**
* ATTRIBUTES
*/
avm_size_t mCapacity;
public:
/**
* CONSTRUCTOR
* Default
*/
BuiltinContainer(class_kind_t aClassKind)
: BuiltinCollection( aClassKind ),
mCapacity( AVM_NUMERIC_MAX_SIZE_T )
{
//!! NOTHING
}
BuiltinContainer(class_kind_t aClassKind, avm_size_t aCapacity)
: BuiltinCollection( aClassKind ),
mCapacity( aCapacity )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
BuiltinContainer(const BuiltinContainer & aBuiltinContainer)
: BuiltinCollection( aBuiltinContainer ),
mCapacity( aBuiltinContainer.mCapacity )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~BuiltinContainer()
{
mCapacity = 0;
}
/**
* CREATION
*/
static BuiltinContainer * create(ContainerTypeSpecifier * containerT);
/**
* GETTER - SETTER
* mCapacity
*/
inline avm_size_t capacity() const
{
return( mCapacity );
}
inline void setCapacity(long aCapacity)
{
mCapacity = (aCapacity < 0) ? AVM_NUMERIC_MAX_SIZE_T : aCapacity;
}
/**
* INTERFACE
*/
virtual BF & at(avm_size_t idx) = 0;
virtual const BF & at(avm_size_t idx) const = 0;
inline virtual BF & operator[](avm_size_t offset)
{
return( at(offset) );
}
inline virtual const BF & operator[](avm_size_t offset) const
{
return( at(offset) );
}
virtual BF & get(avm_size_t idx) = 0;
virtual const BF & get(avm_size_t idx) const = 0;
virtual BF & getWritable(avm_size_t offset) = 0;
virtual void makeWritable(avm_size_t offset) = 0;
virtual void set(avm_size_t idx, const BF & arg) = 0;
/**
* INTERFACE
*/
virtual bool add(const BF & arg) = 0;
inline virtual bool push(const BF & arg)
{
return( add( arg ) );
}
virtual void erase(avm_size_t idx) = 0;
virtual void remove(const BF & arg) = 0;
virtual void clear() = 0;
void copy(BuiltinArray * intputArray, avm_size_t count);
};
class BuiltinList :
public BuiltinContainer,
AVM_INJECT_INSTANCE_COUNTER_CLASS( BuiltinList )
{
AVM_DECLARE_CLONABLE_CLASS( BuiltinList )
protected:
/**
* TYPEDEF
*/
typedef BFList list_type;
public:
typedef list_type::iterator iterator;
typedef list_type::const_iterator const_iterator;
typedef list_type::reverse_iterator reverse_iterator;
typedef list_type::const_reverse_iterator const_reverse_iterator;
protected:
/**
* ATTRIBUTES
*/
list_type mData;
public:
/**
* CONSTRUCTOR
* Default
*/
BuiltinList()
: BuiltinContainer(CLASS_KIND_T( BuiltinList ) ),
mData( )
{
//!! NOTHING
}
BuiltinList(avm_size_t aCapacity)
: BuiltinContainer(CLASS_KIND_T( BuiltinList ), aCapacity ),
mData( )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Other
*/
BuiltinList(class_kind_t aClassKind)
: BuiltinContainer( aClassKind ),
mData( )
{
//!! NOTHING
}
BuiltinList(class_kind_t aClassKind, avm_size_t aCapacity)
: BuiltinContainer( aClassKind , aCapacity ),
mData( )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
BuiltinList(const BuiltinList & aBuiltinList)
: BuiltinContainer( aBuiltinList ),
mData( aBuiltinList.mData )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~BuiltinList()
{
clear();
}
/**
* ITERATOR
*/
inline iterator begin()
{
return( mData.begin() );
}
inline const_iterator begin() const
{
return( mData.begin() );
}
inline iterator end()
{
return( mData.end() );
}
inline const_iterator end() const
{
return( mData.end() );
}
/*
***************************************************************************
* GETTER
* emptiness
***************************************************************************
*/
inline virtual bool empty() const
{
return( mData.empty() );
}
inline virtual bool nonempty() const
{
return( mData.nonempty() );
}
inline virtual bool singleton() const
{
return( mData.singleton() );
}
inline virtual bool populated() const
{
return( mData.populated() );
}
inline virtual avm_size_t size() const
{
return( mData.size() );
}
inline virtual void resize(avm_size_t newSize)
{
mData.resize(newSize);
}
/**
* INTERFACE
*/
virtual BF & at(avm_size_t idx)
{
return( mData.at(idx) );
}
virtual const BF & at(avm_size_t idx) const
{
return( mData.at(idx) );
}
virtual BF & get(avm_size_t idx)
{
return( mData.get(idx) );
}
virtual const BF & get(avm_size_t idx) const
{
return( mData.get(idx) );
}
inline virtual BF & getWritable(avm_size_t idx)
{
iterator it = mData.begin();
iterator endIt = mData.end();
for( ; (it != endIt) && (idx > 0) ; ++it , --idx )
{
//!!! NOTHING
}
if( (idx == 0) && (it != endIt) )
{
(*it).makeWritable();
return( *it );
}
else
{
mData.last().makeWritable();
return( mData.last() );
}
}
inline virtual void makeWritable(avm_size_t idx)
{
iterator it = mData.begin();
iterator endIt = mData.end();
for( ; (it != endIt) && (idx > 0) ; ++it , --idx )
{
//!!! NOTHING
}
if( (idx == 0) && (it != endIt) )
{
(*it).makeWritable();
}
else
{
mData.last().makeWritable();
}
}
inline virtual void set(avm_size_t idx, const BF & arg)
{
iterator it = mData.begin();
iterator endIt = mData.end();
for( ; (it != endIt) && (idx > 0) ; ++it , --idx )
{
//!!! NOTHING
}
if( (idx == 0) && (it != endIt) )
{
(*it) = arg;
}
else
{
add(arg);
}
}
inline virtual bool add(const BF & arg)
{
if( size() < mCapacity)
{
mData.append(arg);
return( true );
}
return( false );
}
inline virtual bool contains(const BF & arg) const
{
return( mData.contains(arg) );
}
inline virtual bool intersect(const BuiltinList & aBuiltin) const
{
return( mData.intersect(aBuiltin.mData) );
}
inline virtual void erase(avm_size_t idx)
{
if( mData.nonempty() )
{
iterator it = mData.begin();
iterator endIt = mData.end();
for( ; (it != endIt) && (idx > 0) ; ++it , --idx )
{
//!!! NOTHING
}
if( (idx == 0) && (it != endIt) )
{
mData.erase(it);
}
}
}
inline virtual void remove(const BF & arg)
{
mData.remove(arg);
}
inline virtual void clear()
{
mData.clear();
}
/**
***************************************************************************
* SERIALIZATION
***************************************************************************
*/
virtual void toStream(OutStream & os) const
{
os << TAB;
AVM_IF_DEBUG_FLAG( DATA )
os << "<" << classKindName() << ">";
AVM_ENDIF_DEBUG_FLAG( DATA )
os << "{ ";
if( mData.nonempty() )
{
const_iterator it = mData.begin();
const_iterator endIt = mData.end();
os << (*it).str();
for( ++it ; it != endIt ; ++it )
{
os << " , " << (*it).str();
}
}
os << " }" << EOL_FLUSH;
}
};
class BuiltinVector :
public BuiltinContainer,
AVM_INJECT_INSTANCE_COUNTER_CLASS( BuiltinVector )
{
AVM_DECLARE_CLONABLE_CLASS( BuiltinVector )
protected:
/**
* TYPEDEF
*/
typedef BFVector vector_type;
public:
typedef vector_type::iterator iterator;
typedef vector_type::const_iterator const_iterator;
protected:
/**
* ATTRIBUTES
*/
vector_type mData;
public:
/**
* CONSTRUCTOR
* Default
*/
BuiltinVector()
: BuiltinContainer( CLASS_KIND_T( BuiltinVector ) ),
mData( )
{
//!! NOTHING
}
BuiltinVector(avm_size_t aCapacity)
: BuiltinContainer( CLASS_KIND_T( BuiltinVector ), aCapacity),
mData( )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
BuiltinVector(const BuiltinVector & aBuiltinVector)
: BuiltinContainer( aBuiltinVector ),
mData( aBuiltinVector.mData )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Default
*/
BuiltinVector(class_kind_t aClassKind)
: BuiltinContainer( aClassKind ),
mData( )
{
//!! NOTHING
}
BuiltinVector(class_kind_t aClassKind, avm_size_t aCapacity)
: BuiltinContainer( aClassKind , aCapacity ),
mData( )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~BuiltinVector()
{
clear();
}
/**
* ITERATOR
*/
inline iterator begin()
{
return( mData.begin() );
}
inline const_iterator begin() const
{
return( mData.begin() );
}
inline iterator end()
{
return( mData.end() );
}
inline const_iterator end() const
{
return( mData.end() );
}
/*
***************************************************************************
* GETTER
* emptiness
***************************************************************************
*/
inline virtual bool empty() const
{
return( mData.empty() );
}
inline virtual bool nonempty() const
{
return( mData.nonempty() );
}
inline virtual bool singleton() const
{
return( mData.singleton() );
}
inline virtual bool populated() const
{
return( mData.populated() );
}
inline virtual avm_size_t size() const
{
return( mData.size() );
}
inline virtual void resize(avm_size_t newSize)
{
mData.resize(newSize);
}
/**
* INTERFACE
*/
virtual BF & at(avm_size_t idx)
{
return( mData.at(idx) );
}
virtual const BF & at(avm_size_t idx) const
{
return( mData.at(idx) );
}
inline virtual BF & operator[](avm_size_t offset)
{
return( mData.operator[](offset) );
}
inline virtual const BF & operator[](avm_size_t offset) const
{
return( mData.operator[](offset) );
}
virtual BF & get(avm_size_t idx)
{
return( mData.get(idx) );
}
virtual const BF & get(avm_size_t idx) const
{
return( mData.get(idx) );
}
inline BF & getWritable(avm_size_t offset)
{
mData[offset].makeWritable();
return( mData[offset] );
}
inline void makeWritable(avm_size_t offset)
{
mData[offset].makeWritable();
}
inline virtual void set(avm_size_t idx, const BF & arg)
{
mData.set(idx, arg);
}
inline virtual bool add(const BF & arg)
{
if( size() < mCapacity)
{
mData.append(arg);
return( true );
}
return( false );
}
inline virtual bool contains(const BF & arg) const
{
return( mData.contains(arg) );
}
inline virtual void erase(avm_size_t idx)
{
mData.erase( mData.begin() + idx );
}
inline virtual void remove(const BF & arg)
{
mData.remove(arg);
}
inline virtual void clear()
{
mData.clear();
}
/**
***************************************************************************
* SERIALIZATION
***************************************************************************
*/
virtual void toStream(OutStream & os) const
{
os << TAB;
AVM_IF_DEBUG_FLAG( DATA )
os << "<" << classKindName() << ">";
AVM_ENDIF_DEBUG_FLAG( DATA )
os << "[ ";
if( mData.nonempty() )
{
const_iterator it = mData.begin();
const_iterator endIt = mData.end();
os << (*it).str();
for( ++it ; it != endIt ; ++it )
{
os << " , " << (*it).str();
}
}
os << " ]" << EOL_FLUSH;
}
};
class BuiltinReverseVector : public BuiltinVector ,
AVM_INJECT_INSTANCE_COUNTER_CLASS( BuiltinReverseVector )
{
AVM_DECLARE_CLONABLE_CLASS( BuiltinReverseVector )
public:
/**
* CONSTRUCTOR
* Default
*/
BuiltinReverseVector()
: BuiltinVector(CLASS_KIND_T( BuiltinReverseVector ) )
{
//!! NOTHING
}
BuiltinReverseVector(avm_size_t aCapacity)
: BuiltinVector(CLASS_KIND_T( BuiltinReverseVector ), aCapacity)
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
BuiltinReverseVector(const BuiltinReverseVector & aBuiltinRVector)
: BuiltinVector( aBuiltinRVector )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~BuiltinReverseVector()
{
clear();
}
/**
* INTERFACE
*/
virtual BF & at(avm_size_t idx)
{
return( mData.reverse_at(idx) );
}
virtual const BF & at(avm_size_t idx) const
{
return( mData.reverse_at(idx) );
}
inline virtual BF & operator[](avm_size_t offset)
{
return( mData.reverse_at(offset) );
}
inline virtual const BF & operator[](avm_size_t offset) const
{
return( mData.reverse_at(offset) );
}
virtual BF & get(avm_size_t idx)
{
return( mData.reverse_get(idx) );
}
virtual const BF & get(avm_size_t idx) const
{
return( mData.reverse_get(idx) );
}
inline BF & getWritable(avm_size_t offset)
{
mData.reverse_get(offset).makeWritable();
return( mData.reverse_get(offset) );
}
inline void makeWritable(avm_size_t offset)
{
mData.reverse_get(offset).makeWritable();
}
inline virtual void set(avm_size_t idx, const BF & arg)
{
mData.reverse_set(idx, arg);
}
};
class BuiltinSet : public BuiltinList ,
AVM_INJECT_INSTANCE_COUNTER_CLASS( BuiltinSet )
{
AVM_DECLARE_CLONABLE_CLASS( BuiltinSet )
public:
/**
* CONSTRUCTOR
* Default
*/
BuiltinSet()
: BuiltinList( CLASS_KIND_T( BuiltinSet ) )
{
//!! NOTHING
}
BuiltinSet(avm_size_t aCapacity)
: BuiltinList( CLASS_KIND_T( BuiltinSet ) , aCapacity )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
BuiltinSet(const BuiltinSet & aBuiltinSet)
: BuiltinList( aBuiltinSet )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~BuiltinSet()
{
}
/**
* INTERFACE
*/
inline virtual bool add(const BF & arg)
{
if( size() < mCapacity )
{
if( not contains(arg) )
{
mData.push_back( arg );
}
return( true );
}
return( false );
}
inline virtual void set(avm_size_t idx, const BF & arg)
{
BuiltinList::remove(arg);
BuiltinList::set(idx, arg);
}
};
class BuiltinBag : public BuiltinList ,
AVM_INJECT_INSTANCE_COUNTER_CLASS( BuiltinBag )
{
AVM_DECLARE_CLONABLE_CLASS( BuiltinBag )
public:
/**
* CONSTRUCTOR
* Default
*/
BuiltinBag()
: BuiltinList( CLASS_KIND_T( BuiltinBag ) )
{
//!! NOTHING
}
BuiltinBag(avm_size_t aCapacity)
: BuiltinList( CLASS_KIND_T( BuiltinBag ) , aCapacity )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
BuiltinBag(const BuiltinBag & aBuiltinBag)
: BuiltinList( aBuiltinBag )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~BuiltinBag()
{
//!! NOTHING
}
/**
* INTERFACE
*/
inline virtual void set(avm_size_t idx, const BF & arg)
{
BuiltinList::set(idx, arg);
}
};
}
#endif /* BUILTINCONTAINER_H_ */