ENH: autoLayerDriver: better layering information message
[OpenFOAM-2.0.x.git] / src / OpenFOAM / primitives / ranges / labelRange / labelRange.C
blob11aacf25cb5cb7ea82b6f8b22626506760adb346
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "labelRange.H"
27 #include "token.H"
30 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
32 const Foam::labelRange::const_iterator Foam::labelRange::endIter_;
34 int Foam::labelRange::debug(::Foam::debug::debugSwitch("labelRange", 0));
37 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
39 Foam::labelRange::labelRange(Istream& is)
41     start_(0),
42     size_(0)
44     is  >> *this;
48 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
50 bool Foam::labelRange::intersects
52     const labelRange& range,
53     const bool touches
54 ) const
56     label final = touches ? 1 : 0;
58     return
59     (
60         this->size()
61      && range.size()
62      &&
63         (
64             (
65                 range.first() >= this->first()
66              && range.first() <= this->last() + final
67             )
68          ||
69             (
70                 this->first() >= range.first()
71              && this->first() <= range.last() + final
72             )
73         )
74     );
78 Foam::labelRange Foam::labelRange::join(const labelRange& range) const
80     // trivial cases first
81     if (!size_)
82     {
83         return *this;
84     }
85     else if (!range.size_)
86     {
87         return range;
88     }
90     const label lower = Foam::min(this->first(), range.first());
91     const label upper = Foam::max(this->last(),  range.last());
92     const label sz = upper - lower + 1;
94     return labelRange(lower, sz);
98 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
100 Foam::labelRange& Foam::labelRange::operator+=(const labelRange& rhs)
102     if (!size_)
103     {
104         // trivial case
105         operator=(rhs);
106     }
107     else if (rhs.size_)
108     {
109         const label lower = Foam::min(this->first(), rhs.first());
110         const label upper = Foam::max(this->last(),  rhs.last());
112         start_ = lower;
113         size_  = upper - lower + 1;
114     }
116     return *this;
120 // * * * * * * * * * * * * * * * Friend Operators  * * * * * * * * * * * * * //
122 Foam::Istream& Foam::operator>>(Istream& is, labelRange& range)
124     is.readBegin("labelRange");
125     is  >> range.start_ >> range.size_;
126     is.readEnd("labelRange");
128     is.check("operator>>(Istream&, labelRange&)");
130     // disallow invalid sizes
131     if (range.size_ <= 0)
132     {
133         range.clear();
134     }
136     return is;
140 Foam::Ostream& Foam::operator<<(Ostream& os, const labelRange& range)
142     // write ASCII only for now
143     os  << token::BEGIN_LIST
144         << range.start_ << token::SPACE << range.size_
145         << token::END_LIST;
147 //    os  << token::BEGIN_BLOCK
148 //        << range.start_ << "-" << range.last()
149 //        << token::END_BLOCK;
151     os.check("operator<<(Ostream&, const labelRange&)");
152     return os;
156 // ************************************************************************* //