2012-09-21 06:43:30 +00:00
|
|
|
|
#ifndef SPROUT_BRAINFUCK_MISA_HPP
|
|
|
|
|
#define SPROUT_BRAINFUCK_MISA_HPP
|
|
|
|
|
|
|
|
|
|
#include <iterator>
|
|
|
|
|
#include <sprout/config.hpp>
|
|
|
|
|
#include <sprout/utility/pair.hpp>
|
|
|
|
|
#include <sprout/container/traits.hpp>
|
|
|
|
|
#include <sprout/container/functions.hpp>
|
|
|
|
|
#include <sprout/algorithm/fixed/result_of.hpp>
|
|
|
|
|
#include <sprout/weed/parse.hpp>
|
|
|
|
|
#include <sprout/weed/parser/lim.hpp>
|
|
|
|
|
#include <sprout/weed/parser/lit.hpp>
|
|
|
|
|
#include <sprout/weed/parser/char/char.hpp>
|
|
|
|
|
#include <sprout/weed/parser/char/char_class.hpp>
|
|
|
|
|
#include <sprout/weed/parser/string/string.hpp>
|
|
|
|
|
#include <sprout/weed/parser/directive/replace.hpp>
|
|
|
|
|
#include <sprout/weed/operator.hpp>
|
|
|
|
|
#include <sprout/brainfuck/detail/convert.hpp>
|
|
|
|
|
|
|
|
|
|
namespace sprout {
|
|
|
|
|
namespace brainfuck {
|
|
|
|
|
namespace misa {
|
|
|
|
|
//
|
|
|
|
|
// to_brainfuck
|
|
|
|
|
//
|
|
|
|
|
template<typename InputIterator, typename Result>
|
|
|
|
|
inline SPROUT_CONSTEXPR sprout::pair<typename sprout::fixed::result_of::algorithm<Result>::type, bool>
|
|
|
|
|
to_brainfuck(InputIterator first, InputIterator last, Result const& result) {
|
|
|
|
|
return sprout::brainfuck::detail::parsed_to_brainfuck(
|
|
|
|
|
sprout::weed::parse(
|
|
|
|
|
first, last,
|
|
|
|
|
*sprout::weed::lim<sprout::container_traits<Result>::static_size>(
|
|
|
|
|
sprout::weed::replace('>')
|
2012-11-18 14:32:36 +00:00
|
|
|
|
[sprout::weed::lit('>') | "\x81\xA8"/*"<22><>"*/ | "\x81\x60"/*"<22>`"*/ | "\x81\5B"/*"<22>["*/]
|
2012-09-21 06:43:30 +00:00
|
|
|
|
| sprout::weed::replace('<')
|
2012-11-18 14:32:36 +00:00
|
|
|
|
[sprout::weed::lit('<') | "\x81\xA9"/*"<22><>"*/ | "\x81\x9A"/*"<22><>"*/ | "\x81\x99"/*"<22><>"*/]
|
2012-09-21 06:43:30 +00:00
|
|
|
|
| sprout::weed::replace('+')
|
2012-11-18 14:32:36 +00:00
|
|
|
|
[sprout::weed::lit('+') | "\x82\xA0"/*"<22><>"*/ | "\x82\x9F"/*"<22><>"*/ | "\x82\xA8"/*"<22><>"*/ | "\x82\xA7"/*"<22><>"*/]
|
2012-09-21 06:43:30 +00:00
|
|
|
|
| sprout::weed::replace('-')
|
2012-11-18 14:32:36 +00:00
|
|
|
|
[sprout::weed::lit('-') | "\x82\xC1"/*"<22><>"*/ | "\x83\x62"/*"<22>b"*/]
|
2012-09-21 06:43:30 +00:00
|
|
|
|
| sprout::weed::replace('.')
|
2012-11-18 14:32:36 +00:00
|
|
|
|
[sprout::weed::lit('.') | "\x81\x49"/*"<22>I"*/]
|
2012-09-21 06:43:30 +00:00
|
|
|
|
| sprout::weed::replace(',')
|
2012-11-18 14:32:36 +00:00
|
|
|
|
[sprout::weed::lit(',') | "\x81\x48"/*"<22>H"*/]
|
2012-09-21 06:43:30 +00:00
|
|
|
|
| sprout::weed::replace('[')
|
2012-11-18 14:32:36 +00:00
|
|
|
|
[sprout::weed::lit('[') | "\x81\x75"/*"<22>u"*/ | "\x81\x77"/*"<22>w"*/]
|
2012-09-21 06:43:30 +00:00
|
|
|
|
| sprout::weed::replace(']')
|
2012-11-18 14:32:36 +00:00
|
|
|
|
[sprout::weed::lit(']') | "\x81\x76"/*"<22>v"*/ | "\x81\x78"/*"<22>x"*/]
|
2012-09-21 06:43:30 +00:00
|
|
|
|
| sprout::weed::replace(' ')
|
|
|
|
|
[sprout::weed::char_]
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
result
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// exec_range
|
|
|
|
|
//
|
2013-02-03 16:10:26 +00:00
|
|
|
|
template<std::size_t BufferSize = 32, typename BidirectionalRangeSource, typename Output, typename InputRangeInput>
|
2012-09-21 06:43:30 +00:00
|
|
|
|
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
2013-02-03 16:10:26 +00:00
|
|
|
|
exec_range(BidirectionalRangeSource const& source, Output const& output, InputRangeInput const& input) {
|
|
|
|
|
typedef typename sprout::container_construct_traits<BidirectionalRangeSource>::copied_type copied_type;
|
2012-09-21 06:43:30 +00:00
|
|
|
|
return sprout::brainfuck::exec_range<BufferSize>(
|
|
|
|
|
sprout::brainfuck::misa::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first,
|
|
|
|
|
output, input
|
|
|
|
|
);
|
|
|
|
|
}
|
2013-02-03 16:10:26 +00:00
|
|
|
|
template<std::size_t BufferSize = 32, typename BidirectionalRangeSource, typename Output>
|
2012-09-21 06:43:30 +00:00
|
|
|
|
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Output>::type
|
2013-02-03 16:10:26 +00:00
|
|
|
|
exec_range(BidirectionalRangeSource const& source, Output const& output) {
|
|
|
|
|
typedef typename sprout::container_construct_traits<BidirectionalRangeSource>::copied_type copied_type;
|
2012-09-21 06:43:30 +00:00
|
|
|
|
return sprout::brainfuck::exec_range<BufferSize>(
|
|
|
|
|
sprout::brainfuck::misa::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first,
|
|
|
|
|
output
|
|
|
|
|
);
|
|
|
|
|
}
|
2013-02-03 16:10:26 +00:00
|
|
|
|
template<std::size_t BufferSize = 32, typename BidirectionalRangeSource>
|
2012-09-21 06:43:30 +00:00
|
|
|
|
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<
|
2013-02-03 16:10:26 +00:00
|
|
|
|
sprout::array<typename sprout::container_traits<BidirectionalRangeSource>::value_type, BufferSize>
|
2012-09-21 06:43:30 +00:00
|
|
|
|
>::type
|
2013-02-03 16:10:26 +00:00
|
|
|
|
exec_range(BidirectionalRangeSource const& source) {
|
|
|
|
|
typedef typename sprout::container_construct_traits<BidirectionalRangeSource>::copied_type copied_type;
|
2012-09-21 06:43:30 +00:00
|
|
|
|
return sprout::brainfuck::exec_range<BufferSize>(
|
|
|
|
|
sprout::brainfuck::misa::to_brainfuck(sprout::begin(source), sprout::end(source), sprout::pit<copied_type>()).first
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
} // namespace misa
|
|
|
|
|
} // namespace brainfuck
|
|
|
|
|
} // namespace sprout
|
|
|
|
|
|
|
|
|
|
#endif // #ifndef SPROUT_BRAINFUCK_MISA_HPP
|