You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							287 lines
						
					
					
						
							9.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							287 lines
						
					
					
						
							9.7 KiB
						
					
					
				
								/* -*- c++ -*- (enables emacs c++ mode) */
							 | 
						|
								/*===========================================================================
							 | 
						|
								 
							 | 
						|
								 Copyright (C) 2002-2012 Yves Renard
							 | 
						|
								 
							 | 
						|
								 This file is a part of GETFEM++
							 | 
						|
								 
							 | 
						|
								 Getfem++  is  free software;  you  can  redistribute  it  and/or modify it
							 | 
						|
								 under  the  terms  of the  GNU  Lesser General Public License as published
							 | 
						|
								 by  the  Free Software Foundation;  either version 3 of the License,  or
							 | 
						|
								 (at your option) any later version along with the GCC Runtime Library
							 | 
						|
								 Exception either version 3.1 or (at your option) any later version.
							 | 
						|
								 This program  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 Lesser General Public
							 | 
						|
								 License and GCC Runtime Library Exception for more details.
							 | 
						|
								 You  should  have received a copy of the GNU Lesser General Public License
							 | 
						|
								 along  with  this program;  if not, write to the Free Software Foundation,
							 | 
						|
								 Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
							 | 
						|
								 
							 | 
						|
								 As a special exception, you  may use  this file  as it is a part of a free
							 | 
						|
								 software  library  without  restriction.  Specifically,  if   other  files
							 | 
						|
								 instantiate  templates  or  use macros or inline functions from this file,
							 | 
						|
								 or  you compile this  file  and  link  it  with other files  to produce an
							 | 
						|
								 executable, this file  does  not  by itself cause the resulting executable
							 | 
						|
								 to be covered  by the GNU Lesser General Public License.  This   exception
							 | 
						|
								 does not  however  invalidate  any  other  reasons why the executable file
							 | 
						|
								 might be covered by the GNU Lesser General Public License.
							 | 
						|
								 
							 | 
						|
								===========================================================================*/
							 | 
						|
								
							 | 
						|
								/**@file gmm_std.h
							 | 
						|
								   @author  Yves Renard <Yves.Renard@insa-lyon.fr>,
							 | 
						|
								   @author  Julien Pommier <Julien.Pommier@insa-toulouse.fr>
							 | 
						|
								   @date June 01, 1995.
							 | 
						|
								   @brief basic setup for gmm (includes, typedefs etc.)
							 | 
						|
								*/
							 | 
						|
								#ifndef GMM_STD_H__
							 | 
						|
								#define GMM_STD_H__
							 | 
						|
								
							 | 
						|
								#ifndef __USE_STD_IOSTREAM
							 | 
						|
								# define __USE_STD_IOSTREAM
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifndef __USE_BSD
							 | 
						|
								# define __USE_BSD
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#ifndef __USE_ISOC99
							 | 
						|
								# define __USE_ISOC99
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								#if defined(_MSC_VER) && _MSC_VER >= 1400 // Secure versions for VC++
							 | 
						|
								# define GMM_SECURE_CRT
							 | 
						|
								# define SECURE_NONCHAR_SSCANF sscanf_s
							 | 
						|
								# define SECURE_NONCHAR_FSCANF fscanf_s
							 | 
						|
								# define SECURE_STRNCPY(a, la, b, lb) strncpy_s(a, la, b, lb)
							 | 
						|
								# define SECURE_FOPEN(F, filename, mode) (*(F) = 0,  fopen_s(F, filename, mode))
							 | 
						|
								# define SECURE_SPRINTF1(S, l, st, p1) sprintf_s(S, l, st, p1) 
							 | 
						|
								# define SECURE_SPRINTF2(S, l, st, p1, p2) sprintf_s(S, l, st, p1, p2) 
							 | 
						|
								# define SECURE_SPRINTF4(S, l, st, p1, p2, p3, p4) sprintf_s(S, l, st, p1, p2, p3, p4)
							 | 
						|
								# define SECURE_STRDUP(s) _strdup(s)
							 | 
						|
								# ifndef _SCL_SECURE_NO_DEPRECATE
							 | 
						|
								#   error Add the option /D_SCL_SECURE_NO_DEPRECATE to the compilation command
							 | 
						|
								# endif
							 | 
						|
								#else
							 | 
						|
								# define SECURE_NONCHAR_SSCANF sscanf
							 | 
						|
								# define SECURE_NONCHAR_FSCANF fscanf
							 | 
						|
								# define SECURE_STRNCPY(a, la, b, lb) strncpy(a, b, lb)
							 | 
						|
								# define SECURE_FOPEN(F, filename, mode) ((*(F)) = fopen(filename, mode))
							 | 
						|
								# define SECURE_SPRINTF1(S, l, st, p1) sprintf(S, st, p1)
							 | 
						|
								# define SECURE_SPRINTF2(S, l, st, p1, p2) sprintf(S, st, p1, p2)
							 | 
						|
								# define SECURE_SPRINTF4(S, l, st, p1, p2, p3, p4) sprintf(S, st, p1, p2, p3, p4) 
							 | 
						|
								# define SECURE_STRDUP(s) strdup(s)
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#if !defined(GMM_USES_MPI) && GETFEM_PARA_LEVEL > 0
							 | 
						|
								# define GMM_USES_MPI
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								/* ********************************************************************** */
							 | 
						|
								/*	Compilers detection.						  */
							 | 
						|
								/* ********************************************************************** */
							 | 
						|
								
							 | 
						|
								/* for sun CC 5.0 ...
							 | 
						|
								#if defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x500
							 | 
						|
								# include <stdcomp.h>
							 | 
						|
								# undef _RWSTD_NO_CLASS_PARTIAL_SPEC
							 | 
						|
								# undef _RWSTD_NO_NAMESPACE
							 | 
						|
								#endif 
							 | 
						|
								*/
							 | 
						|
								/* for VISUAL C++ ...
							 | 
						|
								   #if defined(_MSC_VER) //  && !defined(__MWERKS__)
							 | 
						|
								   #define _GETFEM_MSVCPP_ _MSC_VER
							 | 
						|
								   #endif
							 | 
						|
								*/
							 | 
						|
								
							 | 
						|
								#if defined(__GNUC__)
							 | 
						|
								#  if (__GNUC__ < 3)
							 | 
						|
								#    error : PLEASE UPDATE g++ TO AT LEAST 3.0 VERSION
							 | 
						|
								#  endif
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								/* ********************************************************************** */
							 | 
						|
								/*	C++ Standard Headers.						  */
							 | 
						|
								/* ********************************************************************** */
							 | 
						|
								#include <clocale>
							 | 
						|
								#include <cstdlib>
							 | 
						|
								#include <cstddef>
							 | 
						|
								#include <cmath>
							 | 
						|
								#include <cstring>
							 | 
						|
								#include <cctype>
							 | 
						|
								#include <cassert>
							 | 
						|
								#include <climits>
							 | 
						|
								#include <iostream>
							 | 
						|
								//#include <ios> 
							 | 
						|
								#include <fstream>
							 | 
						|
								#include <ctime>
							 | 
						|
								#include <exception>
							 | 
						|
								#include <typeinfo>
							 | 
						|
								#include <stdexcept>
							 | 
						|
								#include <iterator>
							 | 
						|
								#include <algorithm>
							 | 
						|
								#include <vector>
							 | 
						|
								#include <deque>
							 | 
						|
								#include <string>
							 | 
						|
								#include <complex>
							 | 
						|
								#include <limits>
							 | 
						|
								#include <sstream>
							 | 
						|
								#include <numeric>
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								namespace gmm {
							 | 
						|
								
							 | 
						|
								  using std::endl; using std::cout; using std::cerr;
							 | 
						|
								  using std::ends; using std::cin;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								  /* ********************************************************************* */
							 | 
						|
								  /*       Change locale temporarily.                                      */
							 | 
						|
								  /* ********************************************************************* */
							 | 
						|
								
							 | 
						|
								  class standard_locale {
							 | 
						|
								    std::string cloc;
							 | 
						|
								    std::locale cinloc;
							 | 
						|
								    
							 | 
						|
								  public :
							 | 
						|
								    inline standard_locale(void)
							 | 
						|
								      : cloc(setlocale(LC_NUMERIC, 0)), cinloc(cin.getloc())
							 | 
						|
								    { setlocale(LC_NUMERIC,"C"); cin.imbue(std::locale("C")); }
							 | 
						|
								    inline ~standard_locale()
							 | 
						|
								    { setlocale(LC_NUMERIC, cloc.c_str()); cin.imbue(cinloc); }
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  class stream_standard_locale {
							 | 
						|
								    std::locale cloc;
							 | 
						|
								    std::ios &io;
							 | 
						|
								    
							 | 
						|
								  public :
							 | 
						|
								    inline stream_standard_locale(std::ios &i)
							 | 
						|
								      : cloc(i.getloc()), io(i) { io.imbue(std::locale("C")); }
							 | 
						|
								    inline ~stream_standard_locale() { io.imbue(cloc); }
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								  /* ******************************************************************* */
							 | 
						|
								  /*       Clock functions.                                              */
							 | 
						|
								  /* ******************************************************************* */
							 | 
						|
								  
							 | 
						|
								# if  defined(HAVE_SYS_TIMES)
							 | 
						|
								  inline double uclock_sec(void) {
							 | 
						|
								    static double ttclk = 0.;
							 | 
						|
								    if (ttclk == 0.) ttclk = sysconf(_SC_CLK_TCK);
							 | 
						|
								    tms t; times(&t); return double(t.tms_utime) / ttclk;
							 | 
						|
								  }
							 | 
						|
								# else
							 | 
						|
								  inline double uclock_sec(void)
							 | 
						|
								  { return double(clock())/double(CLOCKS_PER_SEC); }
							 | 
						|
								# endif
							 | 
						|
								  
							 | 
						|
								  /* ******************************************************************** */
							 | 
						|
								  /*	Fixed size integer types.                     			  */
							 | 
						|
								  /* ******************************************************************** */
							 | 
						|
								  // Remark : the test program dynamic_array tests the lenght of
							 | 
						|
								  //          resulting integers
							 | 
						|
								
							 | 
						|
								  template <size_t s> struct fixed_size_integer_generator {
							 | 
						|
								    typedef void int_base_type;
							 | 
						|
								    typedef void uint_base_type;  
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  template <> struct fixed_size_integer_generator<sizeof(char)> {
							 | 
						|
								    typedef signed char int_base_type;
							 | 
						|
								    typedef unsigned char uint_base_type;
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  template <> struct fixed_size_integer_generator<sizeof(short int)
							 | 
						|
								    - ((sizeof(short int) == sizeof(char)) ? 78 : 0)> {
							 | 
						|
								    typedef signed short int int_base_type;
							 | 
						|
								    typedef unsigned short int uint_base_type;
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  template <> struct fixed_size_integer_generator<sizeof(int)
							 | 
						|
								    - ((sizeof(int) == sizeof(short int)) ? 59 : 0)> {
							 | 
						|
								    typedef signed int int_base_type;
							 | 
						|
								    typedef unsigned int uint_base_type;
							 | 
						|
								  };
							 | 
						|
								 
							 | 
						|
								  template <> struct fixed_size_integer_generator<sizeof(long)
							 | 
						|
								    - ((sizeof(int) == sizeof(long)) ? 93 : 0)> {
							 | 
						|
								    typedef signed long int_base_type;
							 | 
						|
								    typedef unsigned long uint_base_type;
							 | 
						|
								  };
							 | 
						|
								
							 | 
						|
								  template <> struct fixed_size_integer_generator<sizeof(long long)
							 | 
						|
								    - ((sizeof(long long) == sizeof(long)) ? 99 : 0)> {
							 | 
						|
								    typedef signed long long int_base_type;
							 | 
						|
								    typedef unsigned long long uint_base_type;
							 | 
						|
								  };
							 | 
						|
								 
							 | 
						|
								  typedef fixed_size_integer_generator<1>::int_base_type int8_type;
							 | 
						|
								  typedef fixed_size_integer_generator<1>::uint_base_type uint8_type;
							 | 
						|
								  typedef fixed_size_integer_generator<2>::int_base_type int16_type;
							 | 
						|
								  typedef fixed_size_integer_generator<2>::uint_base_type uint16_type;
							 | 
						|
								  typedef fixed_size_integer_generator<4>::int_base_type int32_type;
							 | 
						|
								  typedef fixed_size_integer_generator<4>::uint_base_type uint32_type;
							 | 
						|
								  typedef fixed_size_integer_generator<8>::int_base_type int64_type;
							 | 
						|
								  typedef fixed_size_integer_generator<8>::uint_base_type uint64_type;
							 | 
						|
								
							 | 
						|
								// #if INT_MAX == 32767
							 | 
						|
								//   typedef signed int    int16_type;
							 | 
						|
								//   typedef unsigned int uint16_type;
							 | 
						|
								// #elif  SHRT_MAX == 32767
							 | 
						|
								//   typedef signed short int    int16_type;
							 | 
						|
								//   typedef unsigned short int uint16_type;
							 | 
						|
								// #else
							 | 
						|
								// # error "impossible to build a 16 bits integer"
							 | 
						|
								// #endif
							 | 
						|
								
							 | 
						|
								// #if INT_MAX == 2147483647
							 | 
						|
								//   typedef signed int    int32_type;
							 | 
						|
								//   typedef unsigned int uint32_type;
							 | 
						|
								// #elif  SHRT_MAX == 2147483647
							 | 
						|
								//   typedef signed short int    int32_type;
							 | 
						|
								//   typedef unsigned short int uint32_type;
							 | 
						|
								// #elif LONG_MAX == 2147483647
							 | 
						|
								//   typedef signed long int    int32_type;
							 | 
						|
								//   typedef unsigned long int uint32_type;
							 | 
						|
								// #else
							 | 
						|
								// # error "impossible to build a 32 bits integer"
							 | 
						|
								// #endif
							 | 
						|
								
							 | 
						|
								// #if INT_MAX == 9223372036854775807L || INT_MAX == 9223372036854775807
							 | 
						|
								//   typedef signed int    int64_type;
							 | 
						|
								//   typedef unsigned int uint64_type;
							 | 
						|
								// #elif LONG_MAX == 9223372036854775807L || LONG_MAX == 9223372036854775807
							 | 
						|
								//   typedef signed long int    int64_type;
							 | 
						|
								//   typedef unsigned long int uint64_type;
							 | 
						|
								// #elif LLONG_MAX == 9223372036854775807LL || LLONG_MAX == 9223372036854775807L || LLONG_MAX == 9223372036854775807
							 | 
						|
								//   typedef signed long long int int64_type;
							 | 
						|
								//   typedef unsigned long long int uint64_type;
							 | 
						|
								// #else
							 | 
						|
								// # error "impossible to build a 64 bits integer"
							 | 
						|
								// #endif
							 | 
						|
								
							 | 
						|
								#if defined(__GNUC__) && !defined(__ICC)
							 | 
						|
								/* 
							 | 
						|
								   g++ can issue a warning at each usage of a function declared with this special attribute 
							 | 
						|
								   (also works with typedefs and variable declarations)
							 | 
						|
								*/
							 | 
						|
								# define IS_DEPRECATED __attribute__ ((__deprecated__))
							 | 
						|
								/*
							 | 
						|
								   the specified function is inlined at any optimization level 
							 | 
						|
								*/
							 | 
						|
								# define ALWAYS_INLINE __attribute__((always_inline))
							 | 
						|
								#else
							 | 
						|
								# define IS_DEPRECATED
							 | 
						|
								# define ALWAYS_INLINE
							 | 
						|
								#endif
							 | 
						|
								  
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#endif /* GMM_STD_H__ */
							 | 
						|
								
							 |