/*
 *   Copyright (C) 2014  Alfons Wirtz
 *   website www.freerouting.net
 *
 *   Copyright (C) 2017 Michael Hoffer <info@michaelhoffer.de>
 *   Website www.freerouting.mihosoft.eu
*
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License at <http://www.gnu.org/licenses/> 
 *   for more details.
 *
 * LogicalParts.java
 *
 * Created on 26. Maerz 2005, 06:08
 */

package eu.mihosoft.freerouting.library;

import eu.mihosoft.freerouting.logger.FRLogger;

import java.util.Vector;

/**
 * The logical parts contain information for gate swap and pin swap.
 *
 * @author Alfons Wirtz
 */
public class LogicalParts implements java.io.Serializable
{
    /** Adds a logical part to the database. */
    public LogicalPart add(String p_name, LogicalPart.PartPin[] p_part_pin_arr)
    {
        java.util.Arrays.sort(p_part_pin_arr);
        LogicalPart new_part = new LogicalPart(p_name, part_arr.size() + 1, p_part_pin_arr);
        part_arr.add(new_part);
        return new_part;
    }
    
    /**
     * Returns the logical part with the input name or null, if no such package exists.
     */
    public LogicalPart get(String p_name)
    {
        for (LogicalPart curr_part : this.part_arr)
        {
            if (curr_part != null && curr_part.name.compareToIgnoreCase(p_name) == 0)
            {
                return curr_part;
            }
        }
        return null;
    }
    
    /**
     * Returns the logical part with index p_part_no. Part numbers are from 1 to part count.
     */
    public LogicalPart get(int p_part_no)
    {
        LogicalPart result = part_arr.elementAt(p_part_no - 1);
        if (result != null && result.no != p_part_no)
        {
            FRLogger.warn("LogicalParts.get: inconsistent part number");
        }
        return result;
    }
    
    /**
     * Returns the count of logical parts.
     */
    public int count()
    {
        return part_arr.size();
    }
    
    /** The array of logical parts */
    private Vector<LogicalPart> part_arr = new Vector<LogicalPart>();
}
