/*
* Copyright (C) 2007-2013 Xagasoft, All rights reserved.
*
* This file is part of the libgats library and is released under the
* terms of the license contained in the file LICENSE.
*/
using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
namespace Com.Xagasoft.Gats
{
///
/// Encapsulates a single list of GatsObjects.
///
///
/// A list of arbitrary size containing ordered GatsObjects. All standard
/// .NET IList, ICollection, and IEnumerable interfaces are implemented,
/// so a GatsList should work just like a standard List, but with a few
/// extras.
///
public class GatsList : GatsObject, IList,
ICollection, IEnumerable
// IReadOnlyList, IReadOnlyCollection,
// These two are in .net 4.5, not 4.0, mono can't use them.
{
private List Value = new List();
public GatsList()
{
}
public override string ToString()
{
StringBuilder bld = new StringBuilder();
bld.Append("[");
for( int j = 0; j < Value.Count-1; j++ )
{
bld.Append( Value[j] );
bld.Append(", ");
}
bld.Append( Value[Value.Count-1] );
bld.Append("]");
return bld.ToString();
}
public override void Read( Stream s, char type )
{
for(;;)
{
GatsObject obj = GatsObject.Read( s );
if( obj == null )
break;
Value.Add( obj );
}
}
public override void Write( Stream s )
{
s.WriteByte( (int)'l' );
foreach( GatsObject obj in Value )
{
obj.Write( s );
}
s.WriteByte( (int)'e' );
}
//
// Helper functions
//
///
/// Helper function to add a new GatsString to the list.
///
/// The byte array to be added as a GatsString
public void Add( byte[] val )
{
Add( new GatsString( val ) );
}
///
/// Helper function to add a new GatsString to the list.
///
///
/// The string is encoded UTF-8 by .NETs internal facilities.
///
/// The string to be added as a GatsString
public void Add( string val )
{
Add( new GatsString( val ) );
}
///
/// Helper function to add a new GatsInteger to the list.
///
///
/// Implicit upcasting should allow all integer types (byte, short,
/// int, long), and automatic unboxing should allow all object variants
/// to be passed into this method without problem.
///
/// The long to be added as a GatsInteger
public void Add( long val )
{
Add( new GatsInteger( val ) );
}
///
/// Helper function to add a new GatsFloat to the list.
///
///
/// Implicit upcasting should allow floats and doubles to both be
/// accepted by this method. Please note that decimal types are not
/// strictly compatible, please see GatsFloat for more details.
///
/// The double to be added as a GatsFloat
public void Add( double val )
{
Add( new GatsFloat( val ) );
}
///
/// Helper function to add a new GatsBoolean to the list.
///
///
/// The boolean value to be added as a GatsBoolean
///
public void Add( bool val )
{
Add( new GatsBoolean( val ) );
}
///
/// Helper to append a GatsNull to the list.
///
public void AddNull()
{
Add( new GatsNull() );
}
///
/// Helper to append a GatsDictionary to the list.
///
///
/// A new GatsDictionary is constructed, appended to the list, and
/// returned.
///
public GatsDictionary AddDict()
{
GatsDictionary dict = new GatsDictionary();
Add( dict );
return dict;
}
///
/// Helper to append a GatsList to the list.
///
///
/// A new GatsList is constructed, appended to the list, and returned.
///
public GatsList AddList()
{
GatsList list = new GatsList();
Add( list );
return list;
}
//
// List interface overrides under here.
//
public int IndexOf( GatsObject obj )
{
return Value.IndexOf( obj );
}
public void Insert( int idx, GatsObject obj )
{
Value.Insert( idx, obj );
}
public void RemoveAt( int idx )
{
Value.RemoveAt( idx );
}
public GatsObject this[int idx] {
get { return this.Value[idx]; }
set { this.Value[idx] = value; }
}
public int Count {
get { return this.Value.Count; }
}
public bool IsReadOnly {
get { return false; } // this.Value.IsReadOnly; }
}
public void Add( GatsObject obj )
{
Value.Add( obj );
}
public void Clear()
{
Value.Clear();
}
public bool Contains( GatsObject obj )
{
return Value.Contains( obj );
}
public void CopyTo( GatsObject[] result, int count )
{
Value.CopyTo( result, count );
}
public bool Remove( GatsObject obj )
{
return Value.Remove( obj );
}
IEnumerator IEnumerable.GetEnumerator()
{
return Value.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return Value.GetEnumerator();
}
public bool IsFixedSize {
get { return false; } // this.Value.IsFixedSize; }
}
public bool IsSynchronized {
get { return false; } // this.Value.IsSynchronized; }
}
public object SyncRoot {
get { return null; } // this.Value.SyncRoot; }
}
}
}