コンテナの要素をセパレータで連結して表示したい

にあるアルゴリズムが便利すぎます…

3 Jun, 00:05 update/ ファンクタの引数がintになってたのを修正、ostream_iteratorのcharTをostreamのcharTに合わせて指定するようにした (thanks for id:SubaruG)

#include <iterator>
#include <numeric>
#include <iosfwd>
 
template <typename charT, typename Traits, typename Sep, typename Iter>
inline std::basic_ostream<charT, Traits> &listed_print(std::basic_ostream<charT, Traits> &s, const Sep &sep, Iter first, Iter last) {
  typedef typename std::iterator_traits<Iter>::value_type T;
  std::partial_sum(
    first,
    last, 
    std::ostream_iterator<T, charT, Traits>(s),
    [&](const T &, const T &n) {
      return s << sep, n;
  });
  return s;
};
 
#include <iostream>
#include <vector>
 
int main() {
  const std::vector<int> v{ 0, 1, 2, 3, 4 };
  listed_print(std::wcout, L',', v.begin(), v.end());
}

実行結果

0,1,2,3,4

NiosII EDSをUAC環境下で使う

AlteraのソフトコアNiosIIの開発にはEclipseベースのNiosIIが必要ですが、10.1の時点ではUAC環境に対応していません(11.0は未確認)。しかし、Visual StudioのExpress版があれば、UAC環境下でも動作させることができます。

マニフェストの用意

まず、以下の内容でテキストファイルを作成します。名前はnios2-hack.manifestとでもしましょうか。保存場所はAdministratorで見える場所ならどこでもいいです。今回は、%QUARTUS_ROOTDIR%\..\nios2eds\sdk2\binに保存します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Nios2 EDS Support Tool" type="win32"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker"/> 
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

マニフェストの埋め込み

次に、Visual Studio コマンドプロンプトを管理者として実行し、以下のコマンドを実行します。

> cd %QUARTUS_ROOTDIR%\..\nios2eds\sdk2\bin
> for %f in (nios2-*-update-*.exe) do mt -manifest nios2-hack.manifest -outputresource:%f

確認

一般ユーザでnios2-app-update-makefile.exeを実行してUACダイアログが出現しなければ成功です。
これで、UAC環境でもNiosII EDSを使えるようになります。

std::arrayの要素数を自動推論する

だいぶ前に作ったやつ。どこに置いたか探し回ってしまったので備忘録用に。
https://gist.github.com/657582
forkを辿っていくとid:SubaruG先生を巻き込んで進化の様子がわかります。

std::arrayを使うと、各種メンバ関数の追加だけでなく、ポインタへの暗黙変換という罠が無くなるので積極的に活用しましょう。

Boost.勉強会とかいうので喋ってきました

Boost.勉強会 #4 - 加速するデートタイム図書館 -にスピーカとして参加してきました。

移動記録

  • 6:00頃 出発、宮崎空港
  • 7:35-9:20頃 宮崎-羽田
  • 10:15頃 会場着
  • 18:00頃 懇親会開始
  • 21:00頃 二次会(徹カラ)開始
  • 5:30頃 二次会を抜けて羽田へ
  • 7:30-9:10頃 羽田-宮崎
  • 10:30頃 帰着

以下主なトピック

  • 開催中にid:Cryolite先生が2か月ぶりに復活
  • つけ麵おじさんが昼食のつけ麵(大)を残す
  • そのせいで十数人が昼休み超過
  • ぽんぽんが断食を宣言
  • ロックフリー軍団の白熱した議論
  • id:lyrical_logical先生がJIT*1で会場に到着
  • Twitterが落ちる
  • progress_displayさん大人気
  • 懇親会中に伯爵が新潟について語りだす
  • 二次会でカラオケ入ったのに議論が白熱しすぎて誰も歌わない
  • 朝帰り(といっても帰着は10時過ぎ)辛いです

発表資料はこちら。 TR18015:2006を読む

*1:Just In Time

クラステンプレートをメタ関数で特殊化したい

Fusion! Boost.Geometry - Togetter ここら辺から派生した話。
素直にenable_ifを使えばできます。ただし複数の特殊化にマッチした場合はambiguousコンパイルエラー

#include <iostream>
#include <string>
#include <typeinfo>
#include <cxxabi.h>
#include <stdlib.h>

#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>

#ifdef __GNUC__
std::string demangle(const char *mangled) {
        int status;
        char *const p = abi::__cxa_demangle(mangled, 0, 0, &status);
        const std::string s(p);
        free(p);
        return s;
}
#else
std::string demangle(const char *mangled) { return mangled; }
#endif

 
template <typename T, typename = void>
struct F {
        std::string name() const { return "generic F<T> [with T=" + demangle(typeid(T).name()) + "]"; }
};
 
template <typename T>
struct F<T, typename boost::enable_if< boost::is_arithmetic<T> >::type> {
        std::string name() const { return "specialized F<arithmetic_type>"; }
};

template <typename T>
struct F<T, typename boost::enable_if< boost::is_integral<T> >::type> {
        std::string name() const { return "specialized F<integral_type>"; }
};

int main() {
        //std::cout << F<int>().name() << '\n'; //ambiguous
        std::cout << F<double>().name() << '\n';
}

BOOST_FUSION_ADAPT_STRUCTをちょっと便利に

Boost.FusionのBOOST_FUSION_ADAPT_STRUCTマクロを使うとはユーザ定義型をFusionのシーケンスとして扱えるようにできます(参考:ユーザー定義のクラスをFusionのコンテナ(タプル)として使用する - Faith and Brave - C++で遊ぼう)が、メンバの型をいちいち書かないといけないので面倒です。
でも、ちょっとしたヘルパマクロで型の指定を省くことができるようになります。そう、C++0xならね。

#define TRANSFORM_STRUCT_MEMBER(ign, name, member) (decltype(name::member), member)
#define FUSION_ADAPT_STRUCT_AUTO(name, members) \
  BOOST_FUSION_ADAPT_STRUCT(name, BOOST_PP_SEQ_FOR_EACH(TRANSFORM_STRUCT_MEMBER, name, members))

これだけです。

BOOST_FUSION_ADAPT_STRUCT (
    person,
    (int, id)
    (int, age)
    (std::string, name)
)

こうなっていたのが、

FUSION_ADAPT_STRUCT_AUTO(person, (id)(age)(name))

これでおしまいです。楽ちん楽ちん。