FizzBuzzライブラリ

twitterFizzBuzzが書けないプログラマがどうのこうのという話題を目にしたので、日本のどこかにいるFizzBuzzが書けないプログラマさんの為に、FizzBuzz用のC++ライブラリを作ってみました。
ヘッダ(FizzBuzz.h)とソース(FizzBuzz.cpp)があるだけだから簡単にプロジェクトに追加できるよ!
使い方は下の方にありますです。

コード

FizzBuzz.h
#ifndef _FIZZBUZZ_H_
#define _FIZZBUZZ_H_

#include <map>
#include <string>

#ifdef __GNUC__
 #define NONNULL __attribute__((nonnull))
#else
 #define NONNULL
#endif

class FizzBuzz : public ::std::map<int, ::std::string>
{
public:
	::std::string& operator()(int n, ::std::string& str)const;
	::std::string operator()(int n)const;
	char* operator()(int n, char* str)const NONNULL;
};

#endif
FizzBuzz.cpp
#include <cstdio>
#include <cstring>
#include <sstream>
#include "FizzBuzz.h"

using namespace std;

string& FizzBuzz::operator()(int n, string& str)const
{
	bool added = false;
	for(const_iterator itr=begin(); itr!=end(); ++itr){
		if(n % itr->first == 0){
			if(added)
				str += ' ';
			else
				added = true;
			str += itr->second;
		}
	}
	if(!added){
		stringstream sstr;
		sstr << n;
		str = sstr.str();
	}
	return str;
}

string FizzBuzz::operator()(int n)const
{
	string str;
	return operator()(n, str);
}

char* FizzBuzz::operator()(int n, char* str)const
{
	if(str == NULL)
		return NULL;
	
	string s;
	operator()(n, s);
	strcpy(str, s.c_str());
	return str;
}

使い方

例えばこう

#include <iostream>
#include "FizzBuzz.h"

using namespace std;

int main()
{
	FizzBuzz fb;
	fb[3] = "Fizz";
	fb[5] = "Buzz";
	
	for(int i=0; i<=20; ++i){
		cout << fb(i) << endl;
	}
	
	return 0;
}

出力はこう

Fizz Buzz
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz

fb[n] = nの倍数の時に出力させたい文字列
これを最初に設定して、fb(n) とすれば文字列がstring型で返ってきます。
mapを継承しているので、clearするとかイテレータ回して何を設定したのかを確認するとか、色々出来ます。
これであなたも今日からFizzBuzzマスターだね!(