Home | History | Annotate | Download | only in libutil++
      1 /**
      2  * @file utility.h
      3  * General purpose C++ utility
      4  *
      5  * @remark Copyright 2002 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author Philippe Elie
      9  * @author John Levon
     10  */
     11 
     12 #ifndef UTILITY_H
     13 #define UTILITY_H
     14 
     15 #include <cstddef>
     16 
     17 /** noncopyable : object of class derived from this class can't be copied
     18  * and isn't copy-constructible */
     19 class noncopyable {
     20 protected:
     21 	noncopyable() {}
     22 	~noncopyable() {}
     23 private:
     24 	noncopyable(noncopyable const &);
     25 	noncopyable const & operator=(noncopyable const &);
     26 };
     27 
     28 
     29 template<typename T> class scoped_ptr {
     30 public:
     31 	explicit scoped_ptr(T * p = 0) : p_(p) {}
     32 	~scoped_ptr() { delete p_; }
     33 
     34 	void reset(T * p = 0) {
     35 		if (p == p_)
     36 			return;
     37 		delete p_;
     38 		p_ = p;
     39 	}
     40 
     41 	T & operator*() const { return *p_; }
     42 	T * operator->() const { return p_; }
     43 	T * get() const { return p_; }
     44 
     45 	void swap(scoped_ptr & sp) {
     46 		T * tmp = sp.p_;
     47 		sp.p_ = p_;
     48 		p_ = tmp;
     49 	}
     50 
     51 private:
     52 	scoped_ptr & operator=(scoped_ptr const &);
     53 	scoped_ptr(scoped_ptr const &);
     54 	T * p_;
     55 };
     56 
     57 template<typename T> class scoped_array {
     58 public:
     59 	explicit scoped_array(T * p = 0) : p_(p) {}
     60 	~scoped_array() { delete [] p_; }
     61 
     62 	void reset(T * p = 0) {
     63 		if (p == p_)
     64 			return;
     65 		delete [] p_;
     66 		p_ = p;
     67 	}
     68 
     69 	T & operator[](std::ptrdiff_t i) const { return p_[i]; }
     70 	T * get() const { return p_; }
     71 
     72 	void swap(scoped_array & sp) {
     73 		T * tmp = sp.p_;
     74 		sp.p_ = p_;
     75 		p_ = tmp;
     76 	}
     77 
     78 private:
     79 	scoped_array & operator=(scoped_array const &);
     80 	scoped_array(scoped_array const &);
     81 	T * p_;
     82 };
     83 
     84 /**
     85  * @param count
     86  * @param total
     87  *
     88  * return total == 0 ? 1.0 : (count / total);
     89  */
     90 inline double op_ratio(double count, double total)
     91 {
     92 	return total == 0 ? 0.0 : (count / total);
     93 }
     94 
     95 // Part copyright:
     96 //  (C) Copyright boost.org 1999. Permission to copy, use, modify, sell
     97 //  and distribute this software is granted provided this copyright
     98 //  notice appears in all copies. This software is provided "as is" without
     99 //  express or implied warranty, and with no claim as to its suitability for
    100 //  any purpose.
    101 
    102 #endif /* !UTILITY_H */
    103