// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package array

import "array"

export type IntArray struct {
	// TODO do not export field
	array.Array;
}


func (p *IntArray) Init(len int) *IntArray {
	p.Array.Init(len);
	return p;
}


export func NewIntArray(len int) *IntArray {
	return new(IntArray).Init(len)
}


func (p *IntArray) At(i int) int {
	return p.Array.At(i).(int)
}


func (p *IntArray) Set(i int, x int) {
	p.Array.Set(i, x)
}


func (p *IntArray) Last() int {
	return p.Array.Last().(int)
}


func (p *IntArray) Insert(i int, x int) {
	p.Array.Insert(i, x)
}


func (p *IntArray) Remove(i int) int {
	return p.Array.Remove(i).(int)
}


func (p *IntArray) Push(x int) {
	p.Array.Push(x)
}


func (p *IntArray) Pop() int {
	return p.Array.Pop().(int)
}


// SortInterface support
func (p *IntArray) Less(i, j int) bool {
	return p.At(i) < p.At(j)
}
