Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4680 right-hear 1
// The template and inlines for the -*- C++ -*- gslice class.
2
 
3
// Copyright (C) 1997-2001 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 2, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// You should have received a copy of the GNU General Public License along
17
// with this library; see the file COPYING.  If not, write to the Free
18
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19
// USA.
20
 
21
// As a special exception, you may use this file as part of a free software
22
// library without restriction.  Specifically, if other files instantiate
23
// templates or use macros or inline functions from this file, or you compile
24
// this file and link it with other files to produce an executable, this
25
// file does not by itself cause the resulting executable to be covered by
26
// the GNU General Public License.  This exception does not however
27
// invalidate any other reasons why the executable file might be covered by
28
// the GNU General Public License.
29
 
30
// Written by Gabriel Dos Reis 
31
 
32
#ifndef _CPP_BITS_GSLICE_H
33
#define _CPP_BITS_GSLICE_H 1
34
 
35
#pragma GCC system_header
36
 
37
namespace std {
38
 
39
    class gslice
40
    {
41
    public:
42
        gslice ();
43
        gslice (size_t, const valarray&, const valarray&);
44
        // XXX: the IS says the copy-ctor and copy-assignment operators are
45
        //      synthetized by the compiler but they are just unsuitable
46
        //      for a ref-counted semantic
47
        gslice(const gslice&);
48
        ~gslice();
49
 
50
        // XXX: See the note above.
51
        gslice& operator= (const gslice&);
52
 
53
        size_t           start () const;
54
        valarray size () const;
55
        valarray stride () const;
56
 
57
    private:
58
        struct _Indexer {
59
            size_t _M_count;
60
            size_t _M_start;
61
            valarray _M_size;
62
            valarray _M_stride;
63
            valarray _M_index;
64
            _Indexer(size_t, const valarray&,
65
                     const valarray&);
66
            void _M_increment_use() { ++_M_count; }
67
            size_t _M_decrement_use() { return --_M_count; }
68
        };
69
 
70
        _Indexer* _M_index;
71
 
72
        template friend class valarray;
73
    };
74
 
75
    inline size_t
76
    gslice::start () const
77
    { return _M_index ? _M_index->_M_start : 0; }
78
 
79
    inline valarray
80
    gslice::size () const
81
    { return _M_index ? _M_index->_M_size : valarray(); }
82
 
83
    inline valarray
84
    gslice::stride () const
85
    { return _M_index ? _M_index->_M_stride : valarray(); }
86
 
87
    inline gslice::gslice () : _M_index(0) {}
88
 
89
    inline
90
    gslice::gslice(size_t __o, const valarray& __l,
91
                   const valarray& __s)
92
            : _M_index(new gslice::_Indexer(__o, __l, __s)) {}
93
 
94
    inline
95
    gslice::gslice(const gslice& __g) : _M_index(__g._M_index)
96
    { if (_M_index) _M_index->_M_increment_use(); }
97
 
98
    inline
99
    gslice::~gslice()
100
    { if (_M_index && _M_index->_M_decrement_use() == 0) delete _M_index; }
101
 
102
    inline gslice&
103
    gslice::operator= (const gslice& __g)
104
    {
105
        if (__g._M_index) __g._M_index->_M_increment_use();
106
        if (_M_index && _M_index->_M_decrement_use() == 0) delete _M_index;
107
        _M_index = __g._M_index;
108
        return *this;
109
    }
110
 
111
 
112
} // std::
113
 
114
 
115
#endif /* _CPP_BITS_GSLICE_H */
116
 
117
// Local Variables:
118
// mode:c++
119
// End: