/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2022-2024. All rights reserved.
 */

/**
 * @file The file declares the ConcurrentQueue class.
 */

package httpclient4cj

/**
 * The class is ConcurrentQueue<T>
 * @since
 */
class ConcurrentQueue<T> <: Iterable<T> {
    private let maxQueueMemory: Int64

    private var list: ArrayList<T> = ArrayList<T>(32)

    private let m: Monitor

    /**
     * The Function is init constructor
     *
     *
     * @since 29.3
     */
    public init(mutex: Monitor) {
        this.m = mutex
        this.maxQueueMemory = 1024
    }

    public func iterator(): Iterator<T> {
        return list.iterator()
    }

    /**
     * The Function is add
     *
     * @param The param is item of T
     *
     * @since
     */
    public func add(item: T) {
        m.lock()
        try {
            this.list.add(item)
        } finally {
            m.unlock()
        }
    }

    public func get(index: Int64): T {
        synchronized(m) {
            return list[index]
        }
    }

    public func remove(at!: Int64) {
        synchronized(m) {
            list.remove(at: at)
        }
    }

    public func removeIf(predicate: (T) -> Bool) {
        synchronized(m) {
            list.removeIf(predicate)
        }
    }

    public func size(): Int64 {
        synchronized(m) {
            list.size
        }
    }

    public func toArrayList(): ArrayList<T> {
        synchronized(m) {
            return ArrayList<T>(list)
        }
    }
}