addr_range.hh revision 9279
12SN/A/*
29235Sandreas.hansson@arm.com * Copyright (c) 2012 ARM Limited
39235Sandreas.hansson@arm.com * All rights reserved
49235Sandreas.hansson@arm.com *
59235Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
69235Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
79235Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
89235Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
99235Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
109235Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
119235Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
129235Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
139235Sandreas.hansson@arm.com *
141762SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan
152SN/A * All rights reserved.
162SN/A *
172SN/A * Redistribution and use in source and binary forms, with or without
182SN/A * modification, are permitted provided that the following conditions are
192SN/A * met: redistributions of source code must retain the above copyright
202SN/A * notice, this list of conditions and the following disclaimer;
212SN/A * redistributions in binary form must reproduce the above copyright
222SN/A * notice, this list of conditions and the following disclaimer in the
232SN/A * documentation and/or other materials provided with the distribution;
242SN/A * neither the name of the copyright holders nor the names of its
252SN/A * contributors may be used to endorse or promote products derived from
262SN/A * this software without specific prior written permission.
272SN/A *
282SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
302SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
312SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
322SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
332SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
342SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
352SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
362SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
372SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
382SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
392665SN/A *
402665SN/A * Authors: Nathan Binkert
412665SN/A *          Steve Reinhardt
429235Sandreas.hansson@arm.com *          Andreas Hansson
432SN/A */
442SN/A
459235Sandreas.hansson@arm.com#ifndef __BASE_ADDR_RANGE_HH__
469235Sandreas.hansson@arm.com#define __BASE_ADDR_RANGE_HH__
472SN/A
489235Sandreas.hansson@arm.com#include "base/types.hh"
499235Sandreas.hansson@arm.com
509235Sandreas.hansson@arm.comclass AddrRange
512SN/A{
522SN/A
539235Sandreas.hansson@arm.com  public:
542SN/A
559235Sandreas.hansson@arm.com    Addr start;
569235Sandreas.hansson@arm.com    Addr end;
579235Sandreas.hansson@arm.com
589235Sandreas.hansson@arm.com    AddrRange()
599235Sandreas.hansson@arm.com        : start(1), end(0)
609235Sandreas.hansson@arm.com    {}
619235Sandreas.hansson@arm.com
629235Sandreas.hansson@arm.com    AddrRange(Addr _start, Addr _end)
639235Sandreas.hansson@arm.com        : start(_start), end(_end)
649235Sandreas.hansson@arm.com    {}
659235Sandreas.hansson@arm.com
669235Sandreas.hansson@arm.com    AddrRange(const std::pair<Addr, Addr> &r)
671106SN/A        : start(r.first), end(r.second)
68532SN/A    {}
69532SN/A
709235Sandreas.hansson@arm.com    Addr size() const { return end - start + 1; }
71531SN/A    bool valid() const { return start < end; }
729279Sandreas.hansson@arm.com
739279Sandreas.hansson@arm.com    /**
749279Sandreas.hansson@arm.com     * Determine if another range intersects this one, i.e. if there
759279Sandreas.hansson@arm.com     * is an address that is both in this range and the other
769279Sandreas.hansson@arm.com     * range. No check is made to ensure either range is valid.
779279Sandreas.hansson@arm.com     *
789279Sandreas.hansson@arm.com     * @param r Range to intersect with
799279Sandreas.hansson@arm.com     * @return true if the intersection of the two ranges is not empty
809279Sandreas.hansson@arm.com     */
819279Sandreas.hansson@arm.com    bool intersects(const AddrRange& r) const
829279Sandreas.hansson@arm.com    {
839279Sandreas.hansson@arm.com        return (start <= r.start && end >= r.start) ||
849279Sandreas.hansson@arm.com            (start <= r.end && end >= r.end);
859279Sandreas.hansson@arm.com    }
869279Sandreas.hansson@arm.com
879279Sandreas.hansson@arm.com    /**
889279Sandreas.hansson@arm.com     * Determine if this range is a subset of another range, i.e. if
899279Sandreas.hansson@arm.com     * every address in this range is also in the other range. No
909279Sandreas.hansson@arm.com     * check is made to ensure either range is valid.
919279Sandreas.hansson@arm.com     *
929279Sandreas.hansson@arm.com     * @param r Range to compare with
939279Sandreas.hansson@arm.com     * @return true if the this range is a subset of the other one
949279Sandreas.hansson@arm.com     */
959279Sandreas.hansson@arm.com    bool isSubset(const AddrRange& r) const
969279Sandreas.hansson@arm.com    {
979279Sandreas.hansson@arm.com        return start >= r.start && end <= r.end;
989279Sandreas.hansson@arm.com    }
99531SN/A};
1002SN/A
101531SN/A/**
1029235Sandreas.hansson@arm.com * Keep the operators away from SWIG.
103531SN/A */
1049235Sandreas.hansson@arm.com#ifndef SWIG
1052SN/A
106531SN/A/**
107531SN/A * @param range1 is a range.
108531SN/A * @param range2 is a range.
109531SN/A * @return if range1 is less than range2 and does not overlap range1.
110531SN/A */
111531SN/Ainline bool
1129235Sandreas.hansson@arm.comoperator<(const AddrRange& range1, const AddrRange& range2)
113531SN/A{
1141106SN/A    return range1.start < range2.start;
115531SN/A}
116531SN/A
117531SN/A/**
1189235Sandreas.hansson@arm.com * @param addr address in the range
1199235Sandreas.hansson@arm.com * @param range range compared against.
1209235Sandreas.hansson@arm.com * @return indicates that the address is not within the range.
121531SN/A */
122531SN/Ainline bool
1239235Sandreas.hansson@arm.comoperator!=(const Addr& addr, const AddrRange& range)
124531SN/A{
1259235Sandreas.hansson@arm.com    return addr < range.start || addr > range.end;
126531SN/A}
127531SN/A
128531SN/A/**
129531SN/A * @param range range compared against.
130531SN/A * @param pos position compared to the range.
131531SN/A * @return indicates that position pos is within the range.
132531SN/A */
1332SN/Ainline bool
1349235Sandreas.hansson@arm.comoperator==(const AddrRange& range, const Addr& addr)
135531SN/A{
1369235Sandreas.hansson@arm.com    return addr >= range.start && addr <= range.end;
137531SN/A}
1382SN/A
1399235Sandreas.hansson@arm.cominline AddrRange
1409235Sandreas.hansson@arm.comRangeEx(Addr start, Addr end)
1419235Sandreas.hansson@arm.com{ return std::make_pair(start, end - 1); }
1422SN/A
1439235Sandreas.hansson@arm.cominline AddrRange
1449235Sandreas.hansson@arm.comRangeIn(Addr start, Addr end)
1459235Sandreas.hansson@arm.com{ return std::make_pair(start, end); }
1462SN/A
1479235Sandreas.hansson@arm.cominline AddrRange
1489235Sandreas.hansson@arm.comRangeSize(Addr start, Addr size)
1499235Sandreas.hansson@arm.com{ return std::make_pair(start, start + size - 1); }
1502SN/A
1519235Sandreas.hansson@arm.com#endif // SWIG
1522SN/A
1539235Sandreas.hansson@arm.com#endif // __BASE_ADDR_RANGE_HH__
154