Mercurial > octave-dspies
view liboctave/util/oct-refcount.h @ 19010:3fb030666878 draft default tip dspies
Added special-case logical-indexing function
* logical-index.h (New file) : Logical-indexing function. May be called on
octave_value types via call_bool_index
* nz-iterators.h : Add base-class nz_iterator for iterator types. Array has
template bool for whether to internally store row-col or compute on the fly
Add skip_ahead method which skips forward to the next nonzero after its
argument
Add flat_index for computing octave_idx_type index of current position (with
assertion failure in the case of overflow)
Move is_zero to separate file
* ov-base-diag.cc, ov-base-mat.cc, ov-base-sparse.cc, ov-perm.cc
(do_index_op): Add call to call_bool_index in logical-index.h
* Array.h : Move forward-declaration for array_iterator to separate header file
* dim-vector.cc (dim_max): Refers to idx-bounds.h (max_idx)
* array-iter-decl.h (New file): Header file for forward declaration of
array-iterator
* direction.h : Add constants fdirc and bdirc to avoid having to reconstruct
them
* dv-utils.h, dv-utils.cc (New files) :
Utility functions for querying and constructing dim-vectors
* idx-bounds.h (New file) :
Utility constants and functions for determining whether things will overflow
the maximum allowed bounds
* interp-idx.h (New function : to_flat_idx) : Converts row-col pair to linear
index of octave_idx_type
* is-zero.h (New file) : Function for determining whether an element is zero
* logical-index.tst : Add tests for correct return-value dimensions and large
sparse matrix behavior
author | David Spies <dnspies@gmail.com> |
---|---|
date | Fri, 25 Jul 2014 13:39:31 -0600 |
parents | ebb3ef964372 |
children |
line wrap: on
line source
/* Copyright (C) 2012-2013 Jaroslav Hajek This file is part of Octave. Octave 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. Octave 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 Octave; see the file COPYING. If not, see <http://www.gnu.org/licenses/>. */ #if !defined (octave_oct_refcount_h) #define octave_oct_refcount_h 1 #ifndef OCTAVE_CONFIG_INCLUDED # error "The file <octave/config.h> must be included before oct-refcount.h." #endif #if defined (USE_ATOMIC_REFCOUNT) && (defined (_MSC_VER) || defined (__GNUC__)) # if defined (_MSC_VER) # include <intrin.h> # define OCTREFCOUNT_ATOMIC_INCREMENT(x) _InterlockedIncrement((long*)x) # define OCTREFCOUNT_ATOMIC_DECREMENT(x) _InterlockedDecrement((long*)x) # define OCTREFCOUNT_ATOMIC_INCREMENT_POST(x) _InterlockedExchangeAdd((long*)x, 1) # define OCTREFCOUNT_ATOMIC_DECREMENT_POST(x) _InterlockedExchangeAdd((long*)x, -1) # elif defined (__GNUC__) # define OCTREFCOUNT_ATOMIC_INCREMENT(x) __sync_add_and_fetch(x, 1) # define OCTREFCOUNT_ATOMIC_DECREMENT(x) __sync_add_and_fetch(x, -1) # define OCTREFCOUNT_ATOMIC_INCREMENT_POST(x) __sync_fetch_and_add(x, 1) # define OCTREFCOUNT_ATOMIC_DECREMENT_POST(x) __sync_fetch_and_add(x, -1) # endif #else // Generic non-locking versions # define OCTREFCOUNT_ATOMIC_INCREMENT(x) ++(*(x)) # define OCTREFCOUNT_ATOMIC_DECREMENT(x) --(*(x)) # define OCTREFCOUNT_ATOMIC_INCREMENT_POST(x) (*(x))++ # define OCTREFCOUNT_ATOMIC_DECREMENT_POST(x) (*(x))-- #endif // Encapsulates a reference counter. template <class T> class octave_refcount { public: typedef T count_type; octave_refcount(count_type initial_count) : count(initial_count) { } // Increment/Decrement. int is postfix. count_type operator++(void) { return OCTREFCOUNT_ATOMIC_INCREMENT (&count); } count_type operator++(int) { return OCTREFCOUNT_ATOMIC_INCREMENT_POST (&count); } count_type operator--(void) { return OCTREFCOUNT_ATOMIC_DECREMENT (&count); } count_type operator--(int) { return OCTREFCOUNT_ATOMIC_DECREMENT_POST (&count); } operator count_type (void) const { return static_cast<count_type const volatile&> (count); } count_type *get (void) { return &count; } private: count_type count; }; #endif