/* -*- C++ -*- */
/*************************************************************************
 * Copyright(c) 1995~2005  Masaharu Goto (root-cint@cern.ch)
 *
 * For the licensing terms see the file COPYING
 *
 ************************************************************************/
// lib/prec_stl/valarray

#pragma ifndef PREC_STL_VALARRAY
#pragma define PREC_STL_VALARRAY
#pragma link off global PREC_STL_VALARRAY;
#pragma link C++ nestedtypedef;
#pragma link C++ nestedclass;
#if defined(G__HP_aCC) || defined(G__SUNPRO_CC)
#pragma mask_newdelete 0x1c;
#else
#pragma mask_newdelete 0x10;
#endif

// Imported from ANSI/ISO C++ 1997/Nov draft 
// Got some ideas from Scott Snyder, Fermi-lab
// Modified by Masaharu Goto

// G__NOINTOPR to be implemented, 1999/10/10 gotom

#include <stdlib.h>

template<class T> class valarray { 
 public:
  typedef T value_type;       
  // _lib.valarray.cons_ construct/destroy:
  valarray();
#ifdef __CINT__
  valarray(size_t);
#else
  explicit valarray(size_t);
#endif
  valarray(const T&, size_t);
  valarray(const T*, size_t);
  valarray(const valarray&);
#if 0
  valarray(const slice_array<T>&);
  valarray(const gslice_array<T>&);
  valarray(const mask_array<T>&);
  valarray(const indirect_array<T>&);
#endif
  ~valarray();

  // _lib.valarray.assign_ assignment:
  valarray<T>& operator=(const valarray<T>&);
  valarray<T>& operator=(const T&);
#if 0
  valarray<T>& operator=(const slice_array<T>&);
  valarray<T>& operator=(const gslice_array<T>&);
  valarray<T>& operator=(const mask_array<T>&);
  valarray<T>& operator=(const indirect_array<T>&);
#endif
  // _lib.valarray.access_ element access:
  //T                 operator[](size_t) const;
  T&                operator[](size_t);
  // _lib.valarray.sub_ subset operations:
#if 0
  valarray<T>       operator[](slice) const;
  slice_array<T>    operator[](slice);
  valarray<T>       operator[](const gslice&) const;
  gslice_array<T>   operator[](const gslice&);
  valarray<T>       operator[](const valarray<bool>&) const;
  mask_array<T>     operator[](const valarray<bool>&);
  valarray<T>       operator[](const valarray<size_t>&) const;
  indirect_array<T> operator[](const valarray<size_t>&);
#endif

#ifndef G__VISUAL
  // _lib.valarray.unary_ unary operators:
  valarray<T> operator+() const;
  valarray<T> operator-() const;
#if !defined(G__BORLAND) && !defined(G__KCC) && !(G__GNUC>=3) && \
    !defined(G__SUNPRO_CC) && !defined(G__AIX)
  valarray<T> operator~() const;
  valarray<T> operator!() const;
#endif
  // _lib.valarray.cassign_ computed assignment:
  valarray<T>& operator*= (const T&);
  valarray<T>& operator/= (const T&);
  valarray<T>& operator+= (const T&);
  valarray<T>& operator-= (const T&);
  valarray<T>& operator*= (const valarray<T>&);
  valarray<T>& operator/= (const valarray<T>&);
  valarray<T>& operator+= (const valarray<T>&);
  valarray<T>& operator-= (const valarray<T>&);
#if !defined(G__BORLAND) && !defined(G__KCC) && !defined(G__GNUC) && \
    !defined(G__SUNPRO_CC) && !defined(G__AIX)
  valarray<T>& operator%= (const T&);
  valarray<T>& operator^= (const T&);
  valarray<T>& operator&= (const T&);
  valarray<T>& operator|= (const T&);
  valarray<T>& operator<<=(const T&);
  valarray<T>& operator>>=(const T&);
  valarray<T>& operator%= (const valarray<T>&);
  valarray<T>& operator^= (const valarray<T>&);
  valarray<T>& operator|= (const valarray<T>&);
  valarray<T>& operator&= (const valarray<T>&);
  valarray<T>& operator<<=(const valarray<T>&);
  valarray<T>& operator>>=(const valarray<T>&);
#endif
#endif
  // _lib.valarray.members_ member functions:
  size_t size() const; 
  T    sum() const;
#if !defined(G__BORLANDCC5) && defined(G__BORLAND) || defined(G__KCC)
  friend T min(const valarray<T>&) const;
  friend T max(const valarray<T>&) const;
#else
  T    min() const;
  T    max() const;
#endif
  valarray<T> shift (int) const;
  valarray<T> cshift(int) const;
#ifdef G__WIN32
#ifdef __CINT__
  valarray<T> apply(T (*func)(T)) const;
  valarray<T> apply(T (*func)(const T&)) const;
#else
  valarray<T> apply(T func(T)) const;
  valarray<T> apply(T func(const T&)) const;
#endif
#endif
  void resize(size_t sz, T c = T());       

  friend valarray<T> operator*(const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator* (const valarray<T>&, const T&);
  friend valarray<T> operator* (const T&, const valarray<T>&);
  friend valarray<T> operator/ (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator/ (const valarray<T>&, const T&);
  friend valarray<T> operator/ (const T&, const valarray<T>&);
#ifdef G__NEVER  
  // logical operator does not work for floating number
  friend valarray<T> operator% (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator% (const valarray<T>&, const T&);
  friend valarray<T> operator% (const T&, const valarray<T>&);
#endif
  friend valarray<T> operator+ (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator+ (const valarray<T>&, const T&);
  friend valarray<T> operator+ (const T&, const valarray<T>&);
  friend valarray<T> operator- (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator- (const valarray<T>&, const T&);
  friend valarray<T> operator- (const T&, const valarray<T>&);
#ifdef G__NEVER 
  // logical operator does not work for floating number
  friend valarray<T> operator^ (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator^ (const valarray<T>&, const T&);
  friend valarray<T> operator^ (const T&, const valarray<T>&);
  friend valarray<T> operator& (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator& (const valarray<T>&, const T&);
  friend valarray<T> operator& (const T&, const valarray<T>&);
  friend valarray<T> operator| (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator| (const valarray<T>&, const T&);
  friend valarray<T> operator| (const T&, const valarray<T>&);
  friend valarray<T> operator<< (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator<<(const valarray<T>&, const T&);
  friend valarray<T> operator<<(const T&, const valarray<T>&);
  friend valarray<T> operator>> (const valarray<T>&, const valarray<T>&);
  friend valarray<T> operator>>(const valarray<T>&, const T&);
  friend valarray<T> operator>>(const T&, const valarray<T>&);
#endif
  friend valarray<bool> operator&& (const valarray<T>&, const valarray<T>&);
#if (!defined(G__BORLANDCC5) && defined(G__BORLAND)) || defined(G__KCC)
  friend valarray<T> operator&&(const valarray<T>&, const T&);
  friend valarray<T> operator&&(const T&, const valarray<T>&);
#elif (G__GNUC>=3)
  friend valarray<bool> operator&&(const valarray<T>&, const T&);
  // friend valarray<bool> operator&&(const T&, const valarray<T>&);
#else
  friend valarray<bool> operator&&(const valarray<T>&, const T&);
  friend valarray<bool> operator&&(const T&, const valarray<T>&);
#endif
  friend valarray<bool> operator|| (const valarray<T>&, const valarray<T>&);
#if !defined(G__BORLANDCC5) && defined(G__BORLAND) || defined(G__KCC)
  friend valarray<T> operator||(const valarray<T>&, const T&);
  friend valarray<T> operator||(const T&, const valarray<T>&);
#elif (G__GNUC>=3)
  friend valarray<bool> operator||(const valarray<T>&, const T&);
  //friend valarray<bool> operator||(const T&, const valarray<T>&);
#else
  friend valarray<bool> operator||(const valarray<T>&, const T&);
  friend valarray<bool> operator||(const T&, const valarray<T>&);
#endif
#if (G__GNUC>=3)
  friend valarray<bool> operator==(const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator==(const valarray<T>&, const T&);
  //friend valarray<bool> operator==(const T&, const valarray<T>&);
  friend valarray<bool> operator!=(const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator!=(const valarray<T>&, const T&);
  //friend valarray<bool> operator!=(const T&, const valarray<T>&);
  friend valarray<bool> operator< (const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator< (const valarray<T>&, const T&);
  //friend valarray<bool> operator< (const T&, const valarray<T>&);
  friend valarray<bool> operator> (const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator> (const valarray<T>&, const T&);
  //friend valarray<bool> operator> (const T&, const valarray<T>&);
  friend valarray<bool> operator<=(const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator<=(const valarray<T>&, const T&);
  //friend valarray<bool> operator<=(const T&, const valarray<T>&);
  friend valarray<bool> operator>=(const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator>=(const valarray<T>&, const T&);
  //friend valarray<bool> operator>=(const T&, const valarray<T>&);
#else
  friend valarray<bool> operator==(const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator==(const valarray<T>&, const T&);
  friend valarray<bool> operator==(const T&, const valarray<T>&);
  friend valarray<bool> operator!=(const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator!=(const valarray<T>&, const T&);
  friend valarray<bool> operator!=(const T&, const valarray<T>&);
  friend valarray<bool> operator< (const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator< (const valarray<T>&, const T&);
  friend valarray<bool> operator< (const T&, const valarray<T>&);
  friend valarray<bool> operator> (const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator> (const valarray<T>&, const T&);
  friend valarray<bool> operator> (const T&, const valarray<T>&);
  friend valarray<bool> operator<=(const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator<=(const valarray<T>&, const T&);
  friend valarray<bool> operator<=(const T&, const valarray<T>&);
  friend valarray<bool> operator>=(const valarray<T>&, const valarray<T>&);
  friend valarray<bool> operator>=(const valarray<T>&, const T&);
  friend valarray<bool> operator>=(const T&, const valarray<T>&);
#endif
#ifdef G__NEVER
  friend valarray<T> abs  (const valarray<T>&);
  friend valarray<T> acos (const valarray<T>&);
  friend valarray<T> asin (const valarray<T>&);
  friend valarray<T> atan (const valarray<T>&);
  friend valarray<T> atan2 (const valarray<T>&, const valarray<T>&);
  friend valarray<T> atan2(const valarray<T>&, const T&);
  friend valarray<T> atan2(const T&, const valarray<T>&);
  friend valarray<T> cos  (const valarray<T>&);
  friend valarray<T> cosh (const valarray<T>&);
  friend valarray<T> exp  (const valarray<T>&);
  friend valarray<T> log  (const valarray<T>&);
  friend valarray<T> log10(const valarray<T>&);
  friend valarray<T> pow(const valarray<T>&, const valarray<T>&);
  friend valarray<T> pow(const valarray<T>&, const T&);
  friend valarray<T> pow(const T&, const valarray<T>&);
  friend valarray<T> sin  (const valarray<T>&);
  friend valarray<T> sinh (const valarray<T>&);
  friend valarray<T> sqrt (const valarray<T>&);
  friend valarray<T> tan  (const valarray<T>&);
  friend valarray<T> tanh (const valarray<T>&);
#endif

#ifdef G__VISUAL
// Visual C++ 6.0 , FATAL BUG C1001 INTERNAL COMPILER ERROR, workaround
#pragma link MACRO function abs(valarray<T>);
#pragma link MACRO function acos(valarray<T>);
#pragma link MACRO function asin(valarray<T>);
#pragma link MACRO function atan(valarray<T>);
#pragma link MACRO function atan2(valarray<T>,valarray<T>);
#pragma link MACRO function atan2(valarray<T>,T);
#pragma link MACRO function atan2(T,valarray<T>);
#pragma link MACRO function cos(valarray<T>);
#pragma link MACRO function cosh(valarray<T>);
#pragma link MACRO function exp(valarray<T>);
#pragma link MACRO function log(valarray<T>);
#pragma link MACRO function log10(valarray<T>);
#pragma link MACRO function pow(valarray<T>,valarray<T>);
#pragma link MACRO function pow(valarray<T>,T);
#pragma link MACRO function pow(T,valarray<T>);
#pragma link MACRO function sin(valarray<T>);
#pragma link MACRO function sinh(valarray<T>);
#pragma link MACRO function sqrt(valarray<T>);
#pragma link MACRO function tan(valarray<T>);
#pragma link MACRO function tanh(valarray<T>);
#endif

};


#pragma endif

