Skip to content
Snippets Groups Projects
Instant.H 4.58 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*---------------------------------------------------------------------------*\
      =========                 |
      \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
       \\    /   O peration     |
    
    OpenFOAM bot's avatar
    OpenFOAM bot committed
        \\  /    A nd           | www.openfoam.com
    
    OpenFOAM bot's avatar
    OpenFOAM bot committed
    -------------------------------------------------------------------------------
        Copyright (C) 2018 OpenCFD Ltd.
    
    -------------------------------------------------------------------------------
    License
        This file is part of OpenFOAM.
    
        OpenFOAM 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.
    
        OpenFOAM 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
        for more details.
    
        You should have received a copy of the GNU General Public License
        along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
    
    Class
        Foam::Instant
    
    Description
        A tuple of value and key.
        The value often corresponds to a time value, thus the naming of the class.
        The key will usually be a time name or a file name etc.
    
    SourceFiles
        Instant.C
    
    \*---------------------------------------------------------------------------*/
    
    #ifndef Instant_H
    #define Instant_H
    
    #include "scalar.H"
    
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    namespace Foam
    {
    
    /*---------------------------------------------------------------------------*\
                               Class Instant Declaration
    \*---------------------------------------------------------------------------*/
    
    template<class T>
    class Instant
    {
        // Private Data
    
            //- The value (eg, time)
            scalar val_;
    
            //- The name/key
            T key_;
    
    
    public:
    
        // Public classes
    
            //- Less function for sorting
            struct less
            {
                bool operator()(const Instant& a, const Instant& b) const
                {
                    return a.value() < b.value();
                }
            };
    
    
        // Constructors
    
            //- Construct null, with value = 0.
            Instant();
    
            //- Copy construct from components
            Instant(scalar val, const T& key);
    
            //- Move construct from components
            Instant(scalar val, T&& key);
    
            //- Copy construct
            Instant(const Instant&) = default;
    
            //- Move construct
            Instant(Instant&&) = default;
    
    
        // Member Functions
    
            //- The value (const access)
            scalar value() const
            {
                return val_;
            }
    
            //- The value (non-const access)
            scalar& value()
            {
                return val_;
            }
    
            //- The name/key (const access)
            const T& name() const
            {
                return key_;
            }
    
            //- The name/key (non-const access)
            T& name()
            {
                return key_;
            }
    
            //- True if values are equal (includes SMALL for rounding)
            bool equal(scalar val) const;
    
            //- True if values are equal (includes SMALL for rounding)
            template<class T2>
            bool equal(const Instant<T2>& other) const;
    
    
        // Operators
    
            //- Copy assignment
            Instant& operator=(const Instant&) = default;
    
            //- Move assignment
            Instant& operator=(Instant&&) = default;
    };
    
    
    // IOstream Operators
    
    template<class T> Istream& operator>>(Istream& is, Instant<T>& inst);
    template<class T> Ostream& operator<<(Ostream& os, const Instant<T>& inst);
    
    
    // Global Operators
    
    //- Compare instant values for equality
    template<class T1, class T2>
    bool operator==(const Instant<T1>& a, const Instant<T2>& b);
    
    //- Compare instant values for inequality
    template<class T1, class T2>
    bool operator!=(const Instant<T1>& a, const Instant<T2>& b);
    
    //- Compare instant values for less-than
    template<class T1, class T2>
    bool operator<(const Instant<T1>& a, const Instant<T2>& b);
    
    //- Compare instant values for greater-than
    template<class T1, class T2>
    bool operator>(const Instant<T1>& a, const Instant<T2>& b);
    
    
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    } // End namespace Foam
    
    
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    #ifdef NoRepository
        #include "Instant.C"
    #endif
    
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    #endif
    
    // ************************************************************************* //