Commit 62194ea4 authored by Alvarez, Gonzalo's avatar Alvarez, Gonzalo
Browse files

OstringStream

OstringStream used to be typedefed to std::stringstream
with (perhaps) PsimagLite::Allocator.
Now it is a class on itself that contains an old
OstringStream called OstringStreamType and
returned via the operator parens of the new class.
parent 1a9d4bb0
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -136,7 +136,29 @@ struct IsStringLike<std::basic_string<char, std::char_traits<char>, A> > {

typedef std::basic_string<char,std::char_traits<char>,Allocator<char>::Type> String;
typedef std::basic_istringstream<char,std::char_traits<char>,Allocator<char>::Type> IstringStream;
typedef std::basic_ostringstream<char,std::char_traits<char>,Allocator<char>::Type> OstringStream;

class OstringStream {
public:

    typedef std::basic_ostringstream<char,std::char_traits<char>,Allocator<char>::Type>
    OstringStreamType;

    OstringStream(int prec)
    {
        data_.precision(prec);
    }

	int precision(int prec)
	{
		return data_.precision(prec);
	}

    OstringStreamType& operator()() { return data_; }

private:

    OstringStreamType data_;
};

class RuntimeError : public std::runtime_error {
public:
+11 −9
Original line number Diff line number Diff line
@@ -176,16 +176,16 @@ private:

	static void printFinalLegacy(std::ostream& os, const ApplicationInfo& ai)
	{
		OstringStream msg;
		msg<<ai.name_<<"\nsizeof(SizeType)="<<sizeof(SizeType)<<"\n";
		OstringStream msg(std::cout.precision());
		msg()<<ai.name_<<"\nsizeof(SizeType)="<<sizeof(SizeType)<<"\n";
#ifdef USE_FLOAT
		msg<<ai.name_<<" using float\n";
		msg()<<ai.name_<<" using float\n";
#else
		msg<<ai.name_<<" using double\n";
		msg()<<ai.name_<<" using double\n";
#endif
		msg<<"UnixTimeEnd="<<ai.unixTime(false)<<"\n";
		msg<<ai.getTimeDate();
		os<<msg.str();
		msg()<<"UnixTimeEnd="<<ai.unixTime(false)<<"\n";
		msg()<<ai.getTimeDate();
		os<<msg().str();
	}

	RunIdType runIdInternal() const
@@ -194,14 +194,16 @@ private:
		time_t tt = unixTime(true);
		MersenneTwister mt(tt + p);
		unsigned int x = tt ^ mt.random();
		OstringStream msg;
		OstringStream msgg(std::cout.precision());
		OstringStream::OstringStreamType& msg = msgg();
		msg<<x;
		x = p ^ mt.random();
		msg<<x;
		unsigned long int y = atol(msg.str().c_str());
		y ^= mt.random();
		x = BitManip::countKernighan(y);
		OstringStream msg2;
		OstringStream msgg2(std::cout.precision());
		OstringStream::OstringStreamType& msg2 = msgg2();
		msg2<<y;
		if (x < 10) msg2<<"0";
		msg2<<x;
+12 −9
Original line number Diff line number Diff line
@@ -141,9 +141,10 @@ public:
		params.steps=400;
		setMode(params.options);
		computeAandB();
		PsimagLite::OstringStream msg;
		PsimagLite::OstringStream msgg(std::cout.precision());
		PsimagLite::OstringStream::OstringStreamType& msg = msgg();
		msg<<"Constructing... mat.rank="<<mat_.rows()<<" steps="<<params.steps;
		progress_.printline(msg,std::cout);
		progress_.printline(msgg, std::cout);
	}

	void computeGroundState(RealType&, VectorType&)
@@ -270,11 +271,11 @@ private:
			//throw RuntimeError("Norm\n");
		}

		PsimagLite::OstringStream msg;
		msg.precision(8);
		PsimagLite::OstringStream msgg(std::cout.precision());
		PsimagLite::OstringStream::OstringStreamType& msg = msgg();
		msg<<"Found Energy="<<energyTmp<<" after "<<params_.steps;
		msg<<" iterations, "<<" orig. norm="<<norma;
		progress_.printline(msg,os);
		progress_.printline(msgg, os);
	}

	//! only for debugging:
@@ -311,9 +312,10 @@ private:

	void computeAandB()
	{
		PsimagLite::OstringStream msg;
		PsimagLite::OstringStream msgg(std::cout.precision());
		PsimagLite::OstringStream::OstringStreamType& msg = msgg();
		msg<<"Asking LanczosSolver to compute spectrum bounds...";
		progress_.printline(msg,std::cout);
		progress_.printline(msgg, std::cout);

		SolverParametersType params;
		InternalMatrix mat2(mat_);
@@ -340,9 +342,10 @@ private:
		params_.oneOverA=2.0/(eMax-eMin);
		params_.b=(eMax+eMin)/2;

		PsimagLite::OstringStream msg2;
		PsimagLite::OstringStream msgg2(std::cout.precision());
		PsimagLite::OstringStream::OstringStreamType& msg2 = msgg2();
		msg2<<"Spectrum bounds computed, eMax="<<eMax<<" eMin="<<eMin;
		progress_.printline(msg2,std::cout);
		progress_.printline(msgg2, std::cout);
	}

	ProgressIndicator progress_;
+4 −4
Original line number Diff line number Diff line
@@ -111,9 +111,9 @@ public:
	      steps_(params.steps),
	      eps_(params.tolerance)
	{
		OstringStream msg;
		msg<<"Constructing... mat.rank="<<mat_.rows();
		msg<<" steps="<<steps_<<" eps="<<eps_;
		OstringStream msg(std::cout.precision());
		msg()<<"Constructing... mat.rank="<<mat_.rows();
		msg()<<" steps="<<steps_<<" eps="<<eps_;
		progress_.printline(msg, std::cout);
	}

+4 −4
Original line number Diff line number Diff line
@@ -177,9 +177,9 @@ public:
		void printline(OstringStream& s)
		{
			if (rank_!=0) return;
			(*fout_)<<s.str()<<"\n";
			s.flush();
			s.seekp(std::ios_base::beg);
			(*fout_)<<s().str()<<"\n";
			s().flush();
			s().seekp(std::ios_base::beg);
		}

		template<typename T>
Loading