Name:
Anonymous
2012-05-28 0:33
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
class FizzBuzz
{
private:
std::vector<std::string> container;
static const int Mod3=0x01;
static const int Mod5=0x02;
int upto;
public:
template<typename T> static inline std::string Stringify(T&);
FizzBuzz(int upto)
{this->upto=upto;}
void Print();
private:
inline void Process(unsigned int&, int&);
std::vector<std::string> * Check();
};
template<typename T>
inline std::string FizzBuzz::Stringify(T& parm)
{
std::stringstream out;
out << parm;
return out.str();
}
inline void FizzBuzz::Process(unsigned int& c, int& i)
{
if(!(i%3))
c |= Mod3;
if(!(i%5))
c |= Mod5;
}
std::vector<std::string> * FizzBuzz::Check()
{
unsigned int cond;
for(int i=0; i<upto; ++i, cond=0x0)
{
Process(cond, i);
switch(cond)
{
case (Mod3 ^ Mod5):
container.push_back("FizzBuzz");
break;
case Mod3:
container.push_back("Fizz");
break;
case Mod5:
container.push_back("Buzz");
break;
case (Mod3 & Mod5):
container.push_back(Stringify(i));
break;
}
}
return &this->container;
}
void FizzBuzz::Print()
{
std::vector<std::string> * results=Check(); //execute
//print results
for(auto iter=results->begin();
iter!=results->end(); ++iter)
{
std::cout << *iter << std::endl;
}
}
int main()
{
FizzBuzz * demo=new FizzBuzz(100);
demo->Print();
delete demo;
return EXIT_SUCCESS;
}