/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.lisp.msg.types;

/**
 * The identifier of Autonomous System (AS).
 */
public class LispAsAddress extends LispAfiAddress {

    private final int asNum;

    /**
     * Initializes AS identifier number.
     *
     * @param num AS number
     */
    public LispAsAddress(int num) {
        super(AddressFamilyIdentifierEnum.AS);
        this.asNum = num;
    }

    /**
     * Obtains AS identifier number.
     *
     * @return AS number
     */
    public int getASNum() {
        return asNum;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = super.hashCode();
        result = prime * result + asNum;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (!super.equals(obj)) {
            return false;
        }

        if (getClass() != obj.getClass()) {
            return false;
        }

        LispAsAddress other = (LispAsAddress) obj;
        if (asNum != other.asNum) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return String.valueOf(asNum);
    }
}
